LINUX.ORG.RU

Автоматическая раскраска элементов в QComboBox

 


0

1

В общем надо что бы цвета для элементов задавались от зеленого к красного, может есть какой-нибудь простой способ задать градиент?
Пока задаю примерно так:

    ui->comboBox->setItemData( 0, QColor( Qt::black ), Qt::BackgroundRole );
    ui->comboBox->setItemData( 1, QColor( Qt::red ), Qt::BackgroundRole );

★★★★★

Разве что задать цвета массивом и пройтись циклом (а можно сгенерировать в нем же).

CrossFire ★★★★★
()

Можно itemDelegate задать для ui->comboBox->view().

Не совсем понятно, градиент должен идти через все элемены выпадающего списка? Градиент должен быть непрерывным или дискретным по-элементно?

grondek
()
Ответ на: комментарий от grondek

В общем есть разные числовые значения(0.1 0.2 0.3). Их кол-во неизвестно. Нужно самые большие сделать красного цвета, а самые маленькие зеленого.(т.е. каждый элемент должен иметь свой цвет, а весь список должен представлять из себя цветовой градиент)

deterok ★★★★★
() автор топика
Ответ на: комментарий от CrossFire

Эм, что я сделал не так?

QualityComboBox::QualityComboBox(QWidget *parent) :
    QComboBox(parent)
{
    addItem("Testing");
    setItemData(0, QColor(Qt::red), Qt::TextColorRole);
}

Цвет не устанавливается вообще...

deterok ★★★★★
() автор топика
Ответ на: комментарий от deterok

В общем есть разные числовые значения(0.1 0.2 0.3). Их кол-во неизвестно. Нужно самые большие сделать красного цвета, а самые маленькие зеленого.(т.е. каждый элемент должен иметь свой цвет, а весь список должен представлять из себя цветовой градиент)

Вот пример создания градиента на php (код)

Что сделал не так гляну позже.

CrossFire ★★★★★
()
Последнее исправление: CrossFire (всего исправлений: 1)
Ответ на: комментарий от deterok

TextColorRole - устаревшая, надо использовать ForegroundRole.

Вот так раскрашивает:

    ui->comboBox->addItem("Testing");
    ui->comboBox->setItemData(0, Qt::red, Qt::ForegroundRole); // текст
    // или
    ui->comboBox->setItemData(0, Qt::red, Qt::BackgroundRole); // фон

Но в случае ручного расставления цветов тебе придется каждый раз переопределять все цвета для всех элементов списка.

grondek
()

Я бы использовал простенькую модель, в которой цвет бы вычислялся в методе

QVariant QAbstractItemModel::data(const QModelIndex & index, int role = Qt::DisplayRole) const
когда role == Qt::BackgroundRole на основе хранящихся в ней же значений.

com
()
Ответ на: комментарий от EXL

Супер, кусок рыбы тебе в личку!

deterok ★★★★★
() автор топика
Ответ на: комментарий от EXL

Кстати, такие градиенты от красного #ff0000 к зеленому #00ff00 выглядят грязными. Рекомендую попробовать вместо этого сделать два градиента через промежуточный самый светлый цвет #ffff00. Т.е. так #ff0000 -> #ffff00 -> #00ff00.

akinator ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.