Раскрывающийся список QComboBox - установить стиль выбранного элемента - PullRequest
9 голосов
/ 07 декабря 2011

Можно ли установить выбранный стиль элемента (таблицу стилей Qt) из раскрывающегося списка QComboBox?

Ответы [ 3 ]

11 голосов
/ 08 декабря 2011

Решение состоит в том, чтобы

  • создать объект 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;
}
2 голосов
/ 07 декабря 2011

Если вы хотите, чтобы выбранный элемент отображался иначе, когда в комбинированном окне отображаются его элементы (т. Е. В состоянии «выпадающий»), вы можете изменить цвета для Highlight и HighlightedText в палитре или задать стильinner 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();
}

Если вы просто имеете в виду стиль элемента в его «свернутом» состоянии, я бы взглянул на раздел « Customizing QComboBox »Справочник таблиц стилей Qt для примеров того, что вы пытаетесь сделать.

0 голосов
/ 18 августа 2018

@ Сергей Власов: Я не знаю, есть ли лучшее решение для вашей проблемы, но мне удалось решить его следующим образом:

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

это устраняет неприятную рамку вокруг выбранного элемента

...