QComboBox下拉列表 - 设置选中项的样式

9

是否可以设置QComboBox下拉列表中所选项的样式(Qt样式表)?

3个回答

11

解决方法是:

  • 创建一个ListView对象
  • 设置它的样式表
  • 将其用作ComboBox的视图

操作步骤如下:

    int main(int argc, char *argv[])
    {
    QApplication app(argc, argv);
    QMainWindow * mainWindow = new QMainWindow();
    QComboBox * combo = new QComboBox(mainWindow);
    QListView * listView = new QListView(combo);
    combo->addItem("foo");
    combo->addItem("bar");
    combo->addItem("foobar");
    combo->addItem("fooooo");

    listView->setStyleSheet("QListView::item {                              \
                             border-bottom: 5px solid white; margin:3px; }  \
                             QListView::item:selected {                     \
                             border-bottom: 5px solid black; margin:3px;    \
                             color: black;                                  \
                            }                                               \
                            ");
    combo->setView(listView);


    mainWindow->show();
    app.exec();

    return 0;
    }

备注: 我认为,根据Qt文档的说法,应该可以使用这种样式...但实际上并不能。

QComboBox QAbstractItemView::item {
    border-bottom: 5px solid white; margin:3px;
}
QComboBox QAbstractItemView::item:selected {
    border-bottom: 5px solid black; margin:3px;
}

谢谢!但还有一个问题...如何去掉细的选择框?请参见示例:http://vlasovsoft.net/images/1.png - Sergey Vlasov
5
下面展示了一种更好的解决方案:https://dev59.com/yGYr5IYBdhLWcg3w6OGd?rq=1 - bkausbk

2
如果您的意思是希望在组合框显示其元素时(即在“下拉”状态下)选择的项目看起来不同,则可以更改调色板中的高亮和突出文本的颜色,或对内部的QAbstractItemView进行样式设置。
#include <QtGui>

int main(int argc, char **argv) {
  QApplication app(argc, argv);

  QComboBox cb;
  cb.addItem("Item 1");
  cb.addItem("Item 2");
  cb.addItem("Item 3");
  cb.show();

  QPalette p = cb.palette();
  p.setColor(QPalette::HighlightedText, QColor(Qt::red));
  p.setColor(QPalette::Highlight, QColor(Qt::green));
  cb.setPalette(p);

  // OR ...
  // cb.setStyleSheet("QComboBox QAbstractItemView { "
  //                  "selection-background-color: green; "
  //                  "selection-color: red; }");

  return app.exec();
}

如果您只是指元素在“折叠”状态下的样式,建议查看Qt样式表参考手册中“自定义QComboBox”部分的示例,以获取您所需的内容。

谢谢回答!我只是想改变组合框下拉项的选择方式。我不想使用背景颜色来进行选择,而是想使用底部边框。我已经通过QMenu实现了这一点:QMenu::item { border-bottom: 5px solid white; margin:3px; } QMenu::item::selected { border-bottom: 5px solid black; margin:3px; }并且希望在组合框下拉项中也能实现... - Sergey Vlasov

0
@Sergey Vlasov:我不知道你的问题是否有更好的解决方案,但我成功地通过以下方式解决了它:

class MyDelegate : public QStyledItemDelegate
{
protected:
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
    {
        if (option.state & QStyle::State_HasFocus){
            QStyleOptionViewItem my_option = option;
            my_option.state = my_option.state ^ QStyle::State_HasFocus;
            QStyledItemDelegate::paint(painter, my_option, index);
            return;
        }
        QStyledItemDelegate::paint(painter, option, index);
    }
};

然后在你的ComboBox中使用你的代理:

QStyledItemDelegate* itemDelegate = new MyDelegate();
    combobox->setItemDelegate(itemDelegate);

这样就消除了选定项目周围的难看边框。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接