ИВ
June 2, 2021, 7:30 p.m.

Как изменить цвет выбранных элементов 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

Do you like it? Share on social networks!

3
Михаиллл
  • June 2, 2021, 10:05 p.m.

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

    ИВ
    • June 2, 2021, 10:51 p.m.
    • The answer was marked as a solution.

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

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

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

      ИВ
      • June 6, 2021, 7:14 p.m.

      Оказалось есть подводные камни, в пятницу попробовал скомпилировать все это на 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 своеобразная кросптотформенность.

        Comments

        Only authorized users can post comments.
        Please, Log in or Sign up
        • Last comments
        • AK
          April 1, 2025, 11:41 a.m.
          Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
        • Evgenii Legotckoi
          March 9, 2025, 9:02 p.m.
          К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
        • VP
          March 9, 2025, 4:14 p.m.
          Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
        • ИМ
          Nov. 22, 2024, 9:51 p.m.
          Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
        • Evgenii Legotckoi
          Oct. 31, 2024, 11:37 p.m.
          Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup