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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Выделение элемента в QCombobox цветом  (Прочитано 13062 раз)
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);
В выпадающем списке этот элемент выделен, однако когда я выбираю его из списка, то цвет текста возвращается к чёрному, который установлен по умолчанию. Как это можно исправить, чтобы при выделении элемента цвет текста сохранялся?
« Последнее редактирование: Февраль 09, 2011, 00:51 от AlekseyK » Записан
AlekseyK
Гость
« Ответ #1 : Февраль 08, 2011, 19:50 »

У людей такие же проблемы: http://www.qtforum.org/article/26686/qcombobox-set-item-delegate-not-painting-for-current-item.html#post113116 - делегаты не спасают, будем отчёт об ошибках в Нокию писать.
Записан
AlekseyK
Гость
« Ответ #2 : Февраль 09, 2011, 00:50 »

Как только напишешь отчёт об ошибке в нокию как сразу приходит идея с решением. Подмигивающий Решение: перехватываем сигнал currentIndexChanged(int) комбобокса (сигнал activated(QModelIndex) из QTreeView почему-то не перехватывается):
Код
C++ (Qt)
connect(myCombobox, SIGNAL(currentIndexChanged(int)), myCombobox, SLOT(setupComboboxFont()));
и в слоте пишем (способ нахождения текущего индекса я уже здесь приводил, есть ещё более короткий):
Код
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);
}
Всё! Работает! Улыбающийся
« Последнее редактирование: Февраль 09, 2011, 01:08 от AlekseyK » Записан
twp
Гость
« Ответ #3 : Февраль 09, 2011, 14:37 »

а что, styleSheet не работает? К примеру так:
Код:
QComboBox {
    color: blue;
    background-color: yellow;
    selection-color: blue;
    selection-background-color: red;
}
« Последнее редактирование: Февраль 09, 2011, 14:41 от twp » Записан
AlekseyK
Гость
« Ответ #4 : Февраль 09, 2011, 15:35 »

Нет конечно. Потому, что в таком случае ты выделишь все элементы единообразно, а мне нужно только некоторые.
Записан
AlekseyK
Гость
« Ответ #5 : Февраль 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());
}
Записан
twp
Гость
« Ответ #6 : Февраль 09, 2011, 19:26 »

Нет конечно. Потому, что в таком случае ты выделишь все элементы единообразно, а мне нужно только некоторые.
Да ну? Я так понимаю, что просто нет желания почитать документацию по styleSheet. А это очень мощный иструмент - позволяет уменьшить объем кода на С++ и не захламлять его настройками UI.
Тем более что есть толковый перевод: 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;
Записан
AlekseyK
Гость
« Ответ #7 : Февраль 09, 2011, 21:20 »

Да ну!!! Посмотри внимательно на задачу. Все 3 твои варианта не сработают для неё. См. скриншоты, если не понял:



В твоём варианте ЛЮБОЙ выбранный элемент будет выделен, а мне нужно ТОЛЬКО когда выбраны родительские узлы. Возьми, если хочешь, здесь исходник и попробуй свой способ.
Записан
twp
Гость
« Ответ #8 : Февраль 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;
}
Записан
AlekseyK
Гость
« Ответ #9 : Февраль 11, 2011, 12:32 »

Для родительских узлов - возможно. Не пробовал такие вещи, не уверен насчёт синтаксиса. В моём последнем варианте слота ЛЮБОЙ элемент комбобокса можно подсвечивать любым цветом (фон, например, можно сделать аналогично) и комбобокс при выборе элемента будет подсвечиваться соответственно.
Записан
Etud
Гость
« Ответ #10 : Февраль 11, 2011, 19:49 »

AlekseyK, Вы достигли хорошего результата !

p.s. реально применял его для выбора всего-то нескольких вариантов.
Как мне кажется - для этого он нужен.
Записан
AlekseyK
Гость
« Ответ #11 : Февраль 14, 2011, 13:45 »

Etud, спасибо! Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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