ИВ
2 июня 2021 г. 19:30

Как изменить цвет выбранных элементов QListView ?

Qt

Добрый день.
Был уверен что это можно сделать с помощью QSS в редакторе форм, но не вышло. Очень хочется чтобы цвет элемента всегда был blue, не зависимо от темы рабочего стола.
Пробовал сделать у QListView такой стиль:

  1. background-color: rgb(230, 230,230 );
  2. border: 0px solid white;
  3. QListView::item:selected {background-color:blue; color: white;}

Даже прямо указывать имя объекта:

  1. background-color: rgb(230, 230,230 );
  2. border: 0px solid white;
  3. listView::item:selected {background-color:blue; color: white;}

Тут listView это имя объекта QListView.
И ничего - все как было.

Начинаю подозревать, что это в целом не верный подход. Хотя не понятно почему.
Как это в принципе реализуется? Может есть статья где описано решение такой задачи?

2

Вам это нравится? Поделитесь в социальных сетях!

3
Михаиллл
  • 2 июня 2021 г. 22:05

НА сколько помню там нужно задавать стили делегату

    ИВ
    • 2 июня 2021 г. 22:51
    • Ответ был помечен как решение.

    Так и оказалось, вот решение, может кому-то поможет.
    Делаем класс делегата

    1. #include <QStyledItemDelegate>
    2.  
    3. class ListItemDelegate : public QStyledItemDelegate
    4. {
    5. public:
    6. ListItemDelegate(QObject* pobj = 0);
    7. void paint(QPainter* pPainter, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
    8. };
    9.  
    10. #include <QPainter>
    11.  
    12. ListItemDelegate::ListItemDelegate(QObject* pobj) : QStyledItemDelegate(pobj)
    13. {
    14.  
    15. }
    16.  
    17. void ListItemDelegate::paint(QPainter *pPainter, const QStyleOptionViewItem &option, const QModelIndex &index) const
    18. {
    19. if(option.state & QStyle::State_Selected)
    20. {
    21. QRect rect = option.rect;
    22. pPainter->setBrush(QBrush(Qt::blue));
    23. pPainter->setPen(QPen(Qt::blue));
    24. pPainter->drawRect(rect);
    25. }
    26.  
    27. QStyledItemDelegate::paint(pPainter, option, index);
    28. }
    29.  

    и назначаем делегат в виджете

    1. ui->listView->setItemDelegate(new ListItemDelegate(ui->listView));

    Смысл в том, что при выборе строки в списке, вокруг неё всегда будет рисоваться синий квадрат, тупо пайнтером.
    Осталось понять, как менять цвет шрифта при выборе.

      ИВ
      • 6 июня 2021 г. 19:14

      Оказалось есть подводные камни, в пятницу попробовал скомпилировать все это на Astra Linux.
      Если под виндой за все отвечает делегат, то в линуксе он меняет только цвет оконтовки выделенного текста и его шрифт, другими словами имеют значения только вот эти строки

      1. void ListItemDelegate::paint(QPainter* pPainter, const QStyleOptionViewItem& option, const QModelIndex& index) const
      2. {
      3. QStyleOptionViewItem opt = option;
      4. if(option.state & QStyle::State_Selected)
      5. {
      6. QRect rect = opt.rect;
      7. opt.palette.setColor(QPalette::Normal, QPalette::Text, Qt::white);
      8. pPainter->setPen(QPen(Qt::green));
      9. pPainter->drawRect(rect);
      10. }
      11.  
      12. QStyledItemDelegate::paint(pPainter, opt, index);
      13. }

      pPainter->setBrush(QBrush(Qt::green)); - тупо не срабатывает. Чтобы еще и прямоугольник выделения окрашивался в нужный цвет, необходимо все же добавить в стиль QListView строчку

      1. listView::item:selected {background-color:blue;}

      Вот такой вот у Qt своеобразная кросптотформенность.

        Комментарии

        Только авторизованные пользователи могут публиковать комментарии.
        Пожалуйста, авторизуйтесь или зарегистрируйтесь