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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Подсветка заднего фона у QComboBox  (Прочитано 6724 раз)
Danila_Bagrofff
Гость
« : Сентябрь 06, 2011, 12:06 »

Имеем:
Код:
qCmBxStates = new QComboBox();
qCmBxStates->setFixedWidth(WIDTH_COMBO);
connect(qCmBxStates, SIGNAL(activated(int)), this, SLOT(updateState(int)));
statesModel = new ListDataModel(loodsman, qLstStates, this);
qCmBxStates->setModel(statesModel);


void SearchWidget::updateState(int row)
{
    QPalette pal;
    pal.setColor(QPalette::Button, getColorState(qLstStates, row, 0));
    qCmBxStates->setPalette(pal);
}

Подсветка есть только в листе благодаря модели.
А надо сделать подсветку именно в выбранном состоянии. Когда выбран определенный тип из списка. Никак не светится.
Всегда серый фон...

Как сделать?
Записан
Danila_Bagrofff
Гость
« Ответ #1 : Сентябрь 06, 2011, 12:53 »

Сам нашел, сам отвечу =)
Код:
void SearchWidget::updateState(int row)
{
    qCmBxStates->setStyleSheet(getColorState(QString("QComboBox"), qLstStates, row, 0));
}

QString getColorState(QString type, QList<QStringList> *list, int row, int pos)
{
    if(list->at(row).at(pos) == QObject::tr("Архив") || list->at(row).at(pos) == QObject::tr("Архив без проверки состава")
        || list->at(row).at(pos) == QObject::tr("Утвержден"))
        return QString(type + "{background-color:rgb(226, 255, 197)}");
    else if(list->at(row).at(pos) == QObject::tr("Серия"))
        return QString(type + "{background-color:rgb(197, 197, 226)}");
    else if(list->at(row).at(pos) == QObject::tr("Аннулирован"))
        return QString(type + "{background-color:rgb(255, 226, 197)}");
    else if(list->at(row).at(pos) == QObject::tr("Макет"))
        return QString(type + "{background-color:rgb(226, 197, 226)}");
    else if(list->at(row).at(pos) == QObject::tr("Проектирование"))
        return QString(type + "{background-color:rgb(255, 255, 0)}");

    return QString(type + "{background-color:rgb(255, 255, 255)}");
}

Единственное что, стиль сразу становится другим, а не стандартным.... выглядит не очень красиво...

Вместо градиентной заливки она становится монотонной + скругления пропали...
Как вернуть стиль?... пока не нашел подходящего тега...

Записан
twp
Гость
« Ответ #2 : Сентябрь 06, 2011, 15:37 »

ну так же как и установка цвета фона - через стили. Можно и округление сделать и градиентность http://doc.qt.nokia.com/4.7-snapshot/stylesheet-examples.html#customizing-qcombobox

Вообще по идее можно избавится от костыля getColorState ибо использовать строковые данные для того чтоб определить цвет - это нечто. Ведь узнать цвет можно прямо из модели используя Qt::BackgroundRole, например так:

Код:
QModelIndex index = qCmBxStates->model()->index(row, 0);
QVariant data = qCmBxStates->model()->data(index, Qt::BackgroundRole);
QBrush brush = qVariantValue<QBrush>(data);
QColor color = brush.color();

Я не проверял, но по идее можно вообще не использовать стили, а просто установить полученный цвет как фон в комбобоксе:
Код:
QPalette palette = qCmBxStates->palette();
palette.setColor(QPalette::Normal, qCmBxStates->backgroundRole(), color);
qCmBxStates->setPalette(palette);
Записан
Danila_Bagrofff
Гость
« Ответ #3 : Сентябрь 06, 2011, 16:45 »

цвет я получаю, без проблем =)

А вот назначить через palette его не получается =)
Вначале писал тоже самое, что и ты указывал =)

Именно на сам ComboBox задний фон не меняет, не в листе!
Записан
twp
Гость
« Ответ #4 : Сентябрь 06, 2011, 17:09 »

читани это может что-то поможет, в первую очередь QPalette::Base
« Последнее редактирование: Сентябрь 06, 2011, 17:13 от twp » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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