如何设置组合框的 header 颜色?
How can I set the header color of a combo box?
我想制作一个组合框来选择一些与颜色相关的内容。我想让内容的背景显示颜色。我已经做到了:
QList<QString> names;
QList<QColor> bgColors;
QList<QColor> fgColors;
QComboBox* colorComboBox = new QComboBox();
for(int i = 0; i < names.size(); ++i)
{
colorComboBox->addItem(names.at(i), bgColors.at(i));
const QModelIndex idx = colorComboBox->model()->index(i, 0);
colorComboBox->model()->setData(idx, bgColors.at(i), Qt::BackgroundColorRole);
colorComboBox->model()->setData(idx, fgColors.at(i), Qt::ForegroundRole);
}
组合框显示了我想要的文本,以及我想要的背景颜色(不像 ColorEditorFactory 示例那样精致,它只在文本旁边显示一个小矩形,但这正是我想要的)。
我需要的:
一旦选择了 row/color,我希望组合框显示颜色。与现在一样,组合框在关闭时显示文本但不显示颜色。
如何更改组合框的颜色 header? (我叫它 header 但它可能有不同的名称,不确定 - table 上方显示的部分用于选择和组合框关闭时)
编辑:我尝试在 currentIndexChanged
:
上的插槽中设置样式表
setStyleSheet("QComboBox { color: " + fgColor +
"; background-color: " + bgColor + "; }");
结果:它将整个组合框更改为该颜色,忘记了初始颜色。
setStyleSheet("QComboBox:!on { color: " + fgColor +
"; background-color: " + bgColor + "; }");
结果:未选中时它很好地改变了颜色 - 但是突出显示和 header 是灰色的并且难以阅读,我希望我也可以改变它。当我悬停时,整个组合颜色变为我设置的最后一个。
答案可能在样式表中 - 如果我能弄清楚 属性 适用于 header。
如果我理解得很好,您想在单击某个项目时立即更改 QComboBox header 的颜色。我有适合我的代码:
在 .cpp 文件中:
myClass::init() // called in the constructor of myClass
{
names.clear();
names.append("One");
names.append("Two");
names.append("Three");
bgColors.clear();
bgColors.append(QColor("blue"));
bgColors.append(QColor("red"));
bgColors.append(QColor("green"));
fgColors.clear();
fgColors.append(QColor("yellow"));
fgColors.append(QColor("magenta"));
fgColors.append(QColor("cyan"));
colorComboBox = new QComboBox();
colorComboBox->setItemDelegate(new SelectionKillerDelegate);
// don't know why but this line seems important; uncomment it,
// and the text in the QComboBox (not the items) will be highlighted
colorComboBox->setStyleSheet("QComboBox { border-radius: 1px; }");
for(int i = 0; i < names.size(); ++i)
{
colorComboBox->addItem(names.at(i), bgColors.at(i));
const QModelIndex idx = colorComboBox->model()->index(i, 0);
colorComboBox->model()->setData(idx, bgColors.at(i), Qt::BackgroundColorRole);
colorComboBox->model()->setData(idx, fgColors.at(i), Qt::ForegroundRole);
}
connect(colorComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(comboBoxChanged(int)));
}
void myClass::comboBoxChanged(int index)
{
QColor forecolor = (QColor) (colorComboBox->itemData(index, Qt::ForegroundRole).value<QColor>());
QString fgColor = forecolor.name(QColor::HexRgb);
QColor backcolor = (QColor) (colorComboBox->itemData(index, Qt::BackgroundRole).value<QColor>());
QString bgColor = backcolor.name(QColor::HexRgb);
setStyleSheet("QComboBox { color: " + fgColor + "; background-color: " + bgColor + "; }");
}
在 .h 文件中(感谢 this answer 的 QItemDelegate
子类,它允许您选择 QComboBox 的项目但不突出显示):
class SelectionKillerDelegate : public QItemDelegate
{
virtual void paint(QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index) const override
{
QStyleOptionViewItem myOption = option;
myOption.state &= (~QStyle::State_Selected);
QItemDelegate::paint (painter, myOption, index);
}
};
private :
QComboBox* colorComboBox;
QList<QString> names;
QList<QColor> bgColors;
QList<QColor> fgColors;
public slots :
void comboBoxChanged(int);
我希望它也对你有用。
我想制作一个组合框来选择一些与颜色相关的内容。我想让内容的背景显示颜色。我已经做到了:
QList<QString> names;
QList<QColor> bgColors;
QList<QColor> fgColors;
QComboBox* colorComboBox = new QComboBox();
for(int i = 0; i < names.size(); ++i)
{
colorComboBox->addItem(names.at(i), bgColors.at(i));
const QModelIndex idx = colorComboBox->model()->index(i, 0);
colorComboBox->model()->setData(idx, bgColors.at(i), Qt::BackgroundColorRole);
colorComboBox->model()->setData(idx, fgColors.at(i), Qt::ForegroundRole);
}
组合框显示了我想要的文本,以及我想要的背景颜色(不像 ColorEditorFactory 示例那样精致,它只在文本旁边显示一个小矩形,但这正是我想要的)。
我需要的:
一旦选择了 row/color,我希望组合框显示颜色。与现在一样,组合框在关闭时显示文本但不显示颜色。
如何更改组合框的颜色 header? (我叫它 header 但它可能有不同的名称,不确定 - table 上方显示的部分用于选择和组合框关闭时)
编辑:我尝试在 currentIndexChanged
:
setStyleSheet("QComboBox { color: " + fgColor +
"; background-color: " + bgColor + "; }");
结果:它将整个组合框更改为该颜色,忘记了初始颜色。
setStyleSheet("QComboBox:!on { color: " + fgColor +
"; background-color: " + bgColor + "; }");
结果:未选中时它很好地改变了颜色 - 但是突出显示和 header 是灰色的并且难以阅读,我希望我也可以改变它。当我悬停时,整个组合颜色变为我设置的最后一个。
答案可能在样式表中 - 如果我能弄清楚 属性 适用于 header。
如果我理解得很好,您想在单击某个项目时立即更改 QComboBox header 的颜色。我有适合我的代码:
在 .cpp 文件中:
myClass::init() // called in the constructor of myClass
{
names.clear();
names.append("One");
names.append("Two");
names.append("Three");
bgColors.clear();
bgColors.append(QColor("blue"));
bgColors.append(QColor("red"));
bgColors.append(QColor("green"));
fgColors.clear();
fgColors.append(QColor("yellow"));
fgColors.append(QColor("magenta"));
fgColors.append(QColor("cyan"));
colorComboBox = new QComboBox();
colorComboBox->setItemDelegate(new SelectionKillerDelegate);
// don't know why but this line seems important; uncomment it,
// and the text in the QComboBox (not the items) will be highlighted
colorComboBox->setStyleSheet("QComboBox { border-radius: 1px; }");
for(int i = 0; i < names.size(); ++i)
{
colorComboBox->addItem(names.at(i), bgColors.at(i));
const QModelIndex idx = colorComboBox->model()->index(i, 0);
colorComboBox->model()->setData(idx, bgColors.at(i), Qt::BackgroundColorRole);
colorComboBox->model()->setData(idx, fgColors.at(i), Qt::ForegroundRole);
}
connect(colorComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(comboBoxChanged(int)));
}
void myClass::comboBoxChanged(int index)
{
QColor forecolor = (QColor) (colorComboBox->itemData(index, Qt::ForegroundRole).value<QColor>());
QString fgColor = forecolor.name(QColor::HexRgb);
QColor backcolor = (QColor) (colorComboBox->itemData(index, Qt::BackgroundRole).value<QColor>());
QString bgColor = backcolor.name(QColor::HexRgb);
setStyleSheet("QComboBox { color: " + fgColor + "; background-color: " + bgColor + "; }");
}
在 .h 文件中(感谢 this answer 的 QItemDelegate
子类,它允许您选择 QComboBox 的项目但不突出显示):
class SelectionKillerDelegate : public QItemDelegate
{
virtual void paint(QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index) const override
{
QStyleOptionViewItem myOption = option;
myOption.state &= (~QStyle::State_Selected);
QItemDelegate::paint (painter, myOption, index);
}
};
private :
QComboBox* colorComboBox;
QList<QString> names;
QList<QColor> bgColors;
QList<QColor> fgColors;
public slots :
void comboBoxChanged(int);
我希望它也对你有用。