【问题标题】:QComboBox drop-down list - set selected item styleQComboBox 下拉列表 - 设置选中项样式
【发布时间】:2012-01-15 01:35:02
【问题描述】:

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

【问题讨论】:

    标签: qt qcombobox


    【解决方案1】:

    解决办法是

    • 创建一个 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;
        }
    

    备注: 我认为,according to the Qt docs 应用这种风格也应该可以工作......但它没有。

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

    【讨论】:

    【解决方案2】:

    如果您的意思是当组合框显示其元素时(即处于“下拉”状态),您希望所选项目看起来不同,您可以更改调色板中 Highlight 和 HighlightedText 的颜色,或设置样式内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 样式表参考的“Customizing QComboBox”部分,以获取有关您尝试做什么的示例。

    【讨论】:

    • 感谢您的回答!我只是想更改组合框下拉项选择。我不想使用背景颜色进行选择。我想使用底部边框。我设法用 QMenu 做到了这一点: QMenu::item { border-bottom: 5px solid white;边距:3px; } QMenu::item::selected { 边框底部:5px 纯黑色;边距:3px;并想用组合框下拉项来做...
    【解决方案3】:

    @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);
        }
    };
    

    然后在组合框中使用您的委托:

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

    这消除了所选项目周围令人讨厌的框架

    【讨论】:

      猜你喜欢
      • 2015-07-08
      • 2018-01-03
      • 2012-06-30
      • 1970-01-01
      • 2014-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多