0

我想做一个组合框来选择一些与颜色相关的内容。我希望内容的背景显示颜色。我已经做到了:

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 示例那样精致,它只在文本旁边显示一个小矩形,但这就是我想要的方式)。

我需要的:

选择行/颜色后,我希望组合框显示颜色。现在,组合框在关闭时显示文本但不显示颜色。

在此处输入图像描述

如何更改组合框标题的颜色?(我称它为标题,但它可能有不同的名称,不确定 - 显示在表格上方的部分用于选择以及组合框何时关闭)

编辑:我试图在插槽中设置样式表currentIndexChanged

setStyleSheet("QComboBox { color: " + fgColor +
             "; background-color: " + bgColor + "; }");

结果:它改变了该颜色的整个组合框,忘记了初始颜色。

setStyleSheet("QComboBox:!on { color: " + fgColor +
             "; background-color: " + bgColor + "; }");

结果:它在未选中时很好地改变了颜色 - 但突出显示和标题是灰色的并且难以阅读,我希望我也可以改变它。当我悬停时,整个组合颜色会变为我设置的最后一个颜色。

在此处输入图像描述

答案可能在样式表中——如果我能弄清楚哪些属性适用于标题。

4

1 回答 1

1

如果我理解得很好,您希望在单击某个项目后立即更改 QComboBox 标题的颜色。我有这段代码对我有用:

在 .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 文件中(感谢这个答案的子类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);

我希望它也对你有用。

于 2016-05-20T12:05:15.197 回答