Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Иволга от Ноябрь 21, 2019, 11:04



Название: Цвет выделения QListWidgetItem-а
Отправлено: Иволга от Ноябрь 21, 2019, 11:04
Добрый день.

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


Название: Re: Цвет выделения QListWidgetItem-а
Отправлено: Иволга от Ноябрь 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);



Название: Re: Цвет выделения QListWidgetItem-а
Отправлено: Иволга от Ноябрь 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);
}


Название: Re: Цвет выделения QListWidgetItem-а
Отправлено: Day от Ноябрь 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);
}


Название: Re: Цвет выделения QListWidgetItem-а
Отправлено: Иволга от Ноябрь 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);
}
А где здесь два или больше цвета для выделения? Я вижу только один для текста и один для фона.


Название: Re: Цвет выделения QListWidgetItem-а
Отправлено: Day от Ноябрь 23, 2019, 10:57
Иволга, Да, простите, не врубился в вопрос...:)


Название: Re: Цвет выделения QListWidgetItem-а
Отправлено: Day от Ноябрь 23, 2019, 11:03
Иволга Но если использовать QListView, то метод модели data может выдавать что угодно, в том числе и цвет фона, в зависимости от выделенности, содержания и даже от времени суток :)


Название: Re: Цвет выделения QListWidgetItem-а
Отправлено: Иволга от Ноябрь 23, 2019, 11:14
Иволга Но если использовать QListView, то метод модели data может выдавать что угодно, в том числе и цвет фона, в зависимости от выделенности, содержания и даже от времени суток :)
Можете пример привести? Я в теме  "модель/представление" не очень разбираюсь...


Название: Re: Цвет выделения QListWidgetItem-а
Отправлено: Day от Ноябрь 23, 2019, 12:45
Можете пример привести? Я в теме  "модель/представление" не очень разбираюсь...
Ну, в этом случае как бы и примеры бесполезны... Вы попробуйте разобраться... Все равно, я думаю, придется. Мне вот пришлось. И разница во времени - на порядок.
Во время разборки вот какие истины я усек (видимо, тривиальные).
Как модель хранит данные - это лично ее дело. Может даже на лету составлять. Я вот хранил в виде вектора строк специфической для задачи структуры. Ее дело - на запрос стандартного делегата давать Текст, Шрифт, Цвета, Размеры. Ели не знает, что выдать - выдает пустой (незначимый) QVaring. Тогда представление само разберется (по умолчанию).
Собственно, при использовании модели свой делегат практически не нужен. То есть должны быть серьезные основания, чтобы не довериться стандартному. Например, если вы хотите некоторые ячейки перечеркнуть по диагоналям.:)