Russian Qt Forum

Qt => QSS => Тема начата: Danila_Bagrofff от Сентябрь 06, 2011, 12:06



Название: Подсветка заднего фона у QComboBox
Отправлено: 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);
}

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

Как сделать?


Название: Re: Подсветка заднего фона у QComboBox
Отправлено: Danila_Bagrofff от Сентябрь 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)}");
}

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

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



Название: Re: Подсветка заднего фона у QComboBox
Отправлено: twp от Сентябрь 06, 2011, 15:37
ну так же как и установка цвета фона - через стили. Можно и округление сделать и градиентность http://doc.qt.nokia.com/4.7-snapshot/stylesheet-examples.html#customizing-qcombobox (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);


Название: Re: Подсветка заднего фона у QComboBox
Отправлено: Danila_Bagrofff от Сентябрь 06, 2011, 16:45
цвет я получаю, без проблем =)

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

Именно на сам ComboBox задний фон не меняет, не в листе!


Название: Re: Подсветка заднего фона у QComboBox
Отправлено: twp от Сентябрь 06, 2011, 17:09
читани это (http://stackoverflow.com/questions/177778/in-qt-how-do-i-set-the-background-color-of-a-widget-like-combobox-or-double-spin) может что-то поможет, в первую очередь QPalette::Base