Russian Qt Forum
Февраль 27, 2020, 22:56 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Цвет выделения QListWidgetItem-а  (Прочитано 953 раз)
Иволга
Чайник
*
Offline Offline

Сообщений: 52



Просмотр профиля
« : Ноябрь 21, 2019, 11:04 »

Добрый день.

Как для QListWidgetItem-а определять/переопределять цвет, которым он будет выделяться (Highligt) в QListWidget-e?
Необходимо использовать два определённых цвета, которые будут назначаться QListWidgetItem-у в зависимости от поступивших данных.
Записан
Иволга
Чайник
*
Offline Offline

Сообщений: 52



Просмотр профиля
« Ответ #1 : Ноябрь 22, 2019, 10:05 »

Нашла такое решение

Код:
class Delegate : public QStyledItemDelegate
{
Q_OBJECT
public:
Delegate(){}
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
if (option.state & QStyle::State_Selected)
{
                QVariant var = index.model()->data(index, Qt::UserRole);
                painter->setPen(QColor(Qt::white));  // это не обязательно
                painter->fillRect(option.rect, var.value<QColor>());
painter->drawText(option.rect, index.model()->data(index, Qt::DisplayRole).toString());
}
else
QStyledItemDelegate::paint(painter, option, index);
}
};

В конструкторе формы:
Код:
ui.listWidget->setItemDelegate(new Delegate());

Где-то внутри программы:
Код:
QColor color = getMyData() ? QColor(Qt::darkGreen) : QColor(Qt::darkBlue);
myItem->setData(Qt::UserRole, color);

Записан
Иволга
Чайник
*
Offline Offline

Сообщений: 52



Просмотр профиля
« Ответ #2 : Ноябрь 22, 2019, 13:00 »

Немного переделала, т.к. предыдущий вариант искажает форматирование текстового содержимого item-a.
Код:

void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyleOptionViewItem myOpt(option);

if (option.state & QStyle::State_Selected)
{
QPalette pal(myOpt.palette);
        QVariant var = index.model()->data(index, Qt::UserRole);

        pal.setColor(QPalette::Highlight,var.value<QColor>());
        myOpt.palette = pal;
}
QStyledItemDelegate::paint(painter, myOpt, index);
}
Записан
Day
Частый гость
***
Offline Offline

Сообщений: 277


Просмотр профиля
« Ответ #3 : Ноябрь 23, 2019, 10:36 »

Я это делал через qss
Код:
QListView {
    color: rgb(127, 0, 63);
    background-color: rgb(255, 255, 241);
    selection-color: white;
    selection-background-color: rgb(191, 31, 0);
}
Записан
Иволга
Чайник
*
Offline Offline

Сообщений: 52



Просмотр профиля
« Ответ #4 : Ноябрь 23, 2019, 10:47 »

Я это делал через qss
Код:
QListView {
    color: rgb(127, 0, 63);
    background-color: rgb(255, 255, 241);
    selection-color: white;
    selection-background-color: rgb(191, 31, 0);
}
А где здесь два или больше цвета для выделения? Я вижу только один для текста и один для фона.
Записан
Day
Частый гость
***
Offline Offline

Сообщений: 277


Просмотр профиля
« Ответ #5 : Ноябрь 23, 2019, 10:57 »

Иволга, Да, простите, не врубился в вопрос...Улыбающийся
Записан
Day
Частый гость
***
Offline Offline

Сообщений: 277


Просмотр профиля
« Ответ #6 : Ноябрь 23, 2019, 11:03 »

Иволга Но если использовать QListView, то метод модели data может выдавать что угодно, в том числе и цвет фона, в зависимости от выделенности, содержания и даже от времени суток Улыбающийся
Записан
Иволга
Чайник
*
Offline Offline

Сообщений: 52



Просмотр профиля
« Ответ #7 : Ноябрь 23, 2019, 11:14 »

Иволга Но если использовать QListView, то метод модели data может выдавать что угодно, в том числе и цвет фона, в зависимости от выделенности, содержания и даже от времени суток Улыбающийся
Можете пример привести? Я в теме  "модель/представление" не очень разбираюсь...
Записан
Day
Частый гость
***
Offline Offline

Сообщений: 277


Просмотр профиля
« Ответ #8 : Ноябрь 23, 2019, 12:45 »

Можете пример привести? Я в теме  "модель/представление" не очень разбираюсь...
Ну, в этом случае как бы и примеры бесполезны... Вы попробуйте разобраться... Все равно, я думаю, придется. Мне вот пришлось. И разница во времени - на порядок.
Во время разборки вот какие истины я усек (видимо, тривиальные).
Как модель хранит данные - это лично ее дело. Может даже на лету составлять. Я вот хранил в виде вектора строк специфической для задачи структуры. Ее дело - на запрос стандартного делегата давать Текст, Шрифт, Цвета, Размеры. Ели не знает, что выдать - выдает пустой (незначимый) QVaring. Тогда представление само разберется (по умолчанию).
Собственно, при использовании модели свой делегат практически не нужен. То есть должны быть серьезные основания, чтобы не довериться стандартному. Например, если вы хотите некоторые ячейки перечеркнуть по диагоналям.Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 22.