Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: AlekseyK от Февраль 07, 2011, 17:12



Название: [РЕШЕНО] Выделение элемента в QCombobox цветом
Отправлено: AlekseyK от Февраль 07, 2011, 17:12
Есть QCombobox, в качестве модели используется QStandardItemModel, каждый элемент QCombobox-а э то QStandardItem соответственно, QTreeView используется качестве представления. Пробую выделить некоторые (родительские) элементы комбобокса синим так:
Код
C++ (Qt)
QStandardItem* all = new QStandardItem("some text");
all->setForeground(QBrush(QColor(Qt::blue)));
 
или так:
Код
C++ (Qt)
all->setData(Qt::blue, Qt::ForegroundRole);
В выпадающем списке этот элемент выделен, однако когда я выбираю его из списка, то цвет текста возвращается к чёрному, который установлен по умолчанию. Как это можно исправить, чтобы при выделении элемента цвет текста сохранялся?


Название: Re: Выделение элемента в QCombobox цветом
Отправлено: AlekseyK от Февраль 08, 2011, 19:50
У людей такие же проблемы: http://www.qtforum.org/article/26686/qcombobox-set-item-delegate-not-painting-for-current-item.html#post113116 - делегаты не спасают, будем отчёт об ошибках в Нокию писать.


Название: Re: Выделение элемента в QCombobox цветом
Отправлено: AlekseyK от Февраль 09, 2011, 00:50
Как только напишешь отчёт об ошибке в нокию (http://bugreports.qt.nokia.com/browse/QTBUG-17309) как сразу приходит идея с решением. ;) Решение: перехватываем сигнал currentIndexChanged(int) комбобокса (сигнал activated(QModelIndex) из QTreeView почему-то не перехватывается):
Код
C++ (Qt)
connect(myCombobox, SIGNAL(currentIndexChanged(int)), myCombobox, SLOT(setupComboboxFont()));
и в слоте пишем (способ нахождения текущего индекса (http://www.prog.org.ru/index.php?topic=16459.msg109390#msg109390) я уже здесь приводил (http://www.prog.org.ru/index.php?topic=16459.msg109390#msg109390), есть ещё более короткий (http://www.qtcentre.org/threads/31183-QComboBox-with-multipe-selection-via-tree)):
Код
C++ (Qt)
void KComboboxBox::setupComboboxFont()
{
QFont comboboxFont = font();
QPalette comboboxPalette = palette();
QModelIndex index = ((QTreeView *)view())->currentIndex();
if(!index.parent().isValid()) // parent index
{
comboboxFont.setBold(true);
comboboxPalette.setColor(QPalette::Text, Qt::blue);
comboboxPalette.setColor(QPalette::WindowText, Qt::blue);
}
else
{
comboboxFont.setBold(false);
if(parentWidget() != 0)
comboboxPalette = parentWidget()->palette();
}
setFont(comboboxFont);
setPalette(comboboxPalette);
}
Всё! Работает! :)


Название: Re: [РЕШЕНО] Выделение элемента в QCombobox цветом
Отправлено: twp от Февраль 09, 2011, 14:37
а что, styleSheet не работает? К примеру так:
Код:
QComboBox {
    color: blue;
    background-color: yellow;
    selection-color: blue;
    selection-background-color: red;
}


Название: Re: [РЕШЕНО] Выделение элемента в QCombobox цветом
Отправлено: AlekseyK от Февраль 09, 2011, 15:35
Нет конечно. Потому, что в таком случае ты выделишь все элементы единообразно, а мне нужно только некоторые.


Название: Re: [РЕШЕНО] Выделение элемента в QCombobox цветом
Отправлено: AlekseyK от Февраль 09, 2011, 15:48
А можно слот ещё красивее и правильнее написать:

Код
C++ (Qt)
connect(myCombobox, SIGNAL(currentIndexChanged(int)), myCombobox, SLOT(setupComboboxFontAndColor()));

Код
C++ (Qt)
void KComboboxBox::setupComboboxFontAndColor()
{
/// Searches selected item
QModelIndex index = ((QTreeView *)view())->currentIndex();
QStandardItem *item = ((QStandardItemModel *)model())->itemFromIndex(index);
 
/// Setups combobox font and color according to the item font and color
QPalette comboboxPalette = palette();
comboboxPalette.setColor(QPalette::Text, item->foreground().color());
comboboxPalette.setColor(QPalette::WindowText, item->foreground().color());
setPalette(comboboxPalette);
setFont(item->font());
}


Название: Re: [РЕШЕНО] Выделение элемента в QCombobox цветом
Отправлено: twp от Февраль 09, 2011, 19:26
Нет конечно. Потому, что в таком случае ты выделишь все элементы единообразно, а мне нужно только некоторые.
Да ну? Я так понимаю, что просто нет желания почитать документацию по styleSheet. А это очень мощный иструмент - позволяет уменьшить объем кода на С++ и не захламлять его настройками UI.
Тем более что есть толковый перевод: http://www.doc.crossplatform.ru/qt/4.7.x/stylesheet.html (http://www.doc.crossplatform.ru/qt/4.7.x/stylesheet.html)
По сабжу. Есть по крайней мере 3 способа указать стиль для конкретного виджета:
1. Установить в дизайнере.
2. Вызвать QWidget::setStyleSheet для конкретного виджета
3. Использовать Селектор идентификатора (ID): QComboBox#objectName { ... }
В первом и втором случае имя класса опускается (QComboBox):
Код:
    color: blue;
    background-color: yellow;
    selection-color: blue;
    selection-background-color: red;


Название: Re: [РЕШЕНО] Выделение элемента в QCombobox цветом
Отправлено: AlekseyK от Февраль 09, 2011, 21:20
Да ну!!! Посмотри внимательно на задачу. Все 3 твои варианта не сработают для неё. См. скриншоты, если не понял:

(http://img694.imageshack.us/img694/7761/34494006.png) (http://img525.imageshack.us/img525/4466/78731208.png)

В твоём варианте ЛЮБОЙ выбранный элемент будет выделен, а мне нужно ТОЛЬКО когда выбраны родительские узлы. Возьми, если хочешь, здесь (http://bugreports.qt.nokia.com/browse/QTBUG-17309) исходник и попробуй свой способ.


Название: Re: [РЕШЕНО] Выделение элемента в QCombobox цветом
Отправлено: twp от Февраль 10, 2011, 14:34
да согласен, я по другому задачу представлял, и по всей видимости одним qss эту задачу не решить. По идее ее можно решить с использованием динамических свойств, т.е. в том слоте, который обрабатывает изменение текущего индекса, менять для комбобокса динамическое свoйство (например hasChildren), в зависимости от того, имеет ли итем чайлдов или нет, а в qss прописать что-то типа такого:
Код:
QComboBox[hasChildren="true"] {
    color: blue;
    background-color: yellow;
    selection-color: blue;
    selection-background-color: red;
    font: bold 16px;
}


Название: Re: [РЕШЕНО] Выделение элемента в QCombobox цветом
Отправлено: AlekseyK от Февраль 11, 2011, 12:32
Для родительских узлов - возможно. Не пробовал такие вещи, не уверен насчёт синтаксиса. В моём последнем варианте слота ЛЮБОЙ элемент комбобокса можно подсвечивать любым цветом (фон, например, можно сделать аналогично) и комбобокс при выборе элемента будет подсвечиваться соответственно.


Название: Re: [РЕШЕНО] Выделение элемента в QCombobox цветом
Отправлено: Etud от Февраль 11, 2011, 19:49
AlekseyK, Вы достигли хорошего результата !

p.s. реально применял его для выбора всего-то нескольких вариантов.
Как мне кажется - для этого он нужен.


Название: Re: [РЕШЕНО] Выделение элемента в QCombobox цветом
Отправлено: AlekseyK от Февраль 14, 2011, 13:45
Etud, спасибо! :)