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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QComboBox - отрисовка в строке ввода  (Прочитано 6182 раз)
spectre71
Гость
« : Июнь 19, 2009, 18:39 »

Сделал свой делегат для QComboBox, в выпадающем списке делаем свою отрисовку.
Не могу понять, как сделать ту же отрисовку(для выбранного индекса) в строке ввода комбобокса.

И дополнительный вопрос для текущей итерации отрисовки
QAbstractItemDelegate::paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index )
Как получить из option цвет фонта которым рисовать.
Записан
BRE
Гость
« Ответ #1 : Июнь 19, 2009, 18:47 »

Как получить из option цвет фонта которым рисовать.
У фонта нет цвета, все цвета находяться в палитре:
QPalette QStyleOption::palette
Записан
spectre71
Гость
« Ответ #2 : Июнь 19, 2009, 19:18 »

У фонта нет цвета, все цвета находяться в палитре:
QPalette QStyleOption::palette
Я спросил как получить цвет фонта(можно сказать для фонта), а не то что у фонта есть цвет.
Мне нужен цвет который я установлю в QPainter::setPen, когда буду ввыводить текст через QPainter::drawText
Записан
BRE
Гость
« Ответ #3 : Июнь 19, 2009, 19:53 »

Я спросил как получить цвет фонта(можно сказать для фонта), а не то что у фонта есть цвет.
Мне нужен цвет который я установлю в QPainter::setPen, когда буду ввыводить текст через QPainter::drawText
Посмотри внимательно описание:
enum QPalette::ColorRole
и
const QColor & QPalette::color ( ColorGroup group, ColorRole role ) const
Записан
spectre71
Гость
« Ответ #4 : Июнь 19, 2009, 20:02 »

Посмотри внимательно описание:
enum QPalette::ColorRole
и
const QColor & QPalette::color ( ColorGroup group, ColorRole role ) const

QAbstractItemDelegate::paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index )
Тогда как мне получить ColorGroup и ColorRole для отрисовки текста для текущей итерации paint, тогда я смогу из QPalette вытащить нужный цвет.

Ну а самое главное по поводу отрисовки(для выбранного индекса) в строке ввода комбобокса кто знает?
Записан
BRE
Гость
« Ответ #5 : Июнь 19, 2009, 20:10 »

QAbstractItemDelegate::paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index )
Тогда как мне получить ColorGroup и ColorRole для отрисовки текста для текущей итерации paint, тогда я смогу из QPalette вытащить нужный цвет.
Что-то типа такого (это для QStyleOptionViewItem):
Код:
	QPalette::ColorGroup cg = option.state & QStyle::State_Enabled? QPalette::Normal : QPalette::Disabled;
if( cg == QPalette::Normal && !( option.state & QStyle::State_Active ) )
cg = QPalette::Inactive;
Записан
spectre71
Гость
« Ответ #6 : Июнь 19, 2009, 20:39 »

Короче с палитрой я понял, думал что есть более простой способ.
Я понимаю, когда хочешь чего-то изменить, поиграться со стилями итд. Но получать таким способ текущие цвета по умолчанию - явно перемудрили.
Записан
BRE
Гость
« Ответ #7 : Июнь 19, 2009, 20:47 »

Посмотри еще на QStyle, им можно рисовать, что надо:
Код
C++ (Qt)
void RemoteButton::paintEvent( QPaintEvent *event )
{
QStyleOptionButton option;
option.initFrom( this );
option.state |= isDown() ? QStyle::State_Sunken : QStyle::State_Raised;
 
QPainter painter( this );
style()->drawControl( QStyle::CE_PushButtonBevel, &option, &painter, this );
...
 
Записан
spectre71
Гость
« Ответ #8 : Июнь 19, 2009, 21:30 »

Посмотри еще на QStyle, им можно рисовать, что надо:
Ты имеешь ввиду для отрисовки в строке ввода? Попробую.
Записан
spectre71
Гость
« Ответ #9 : Июнь 19, 2009, 21:48 »

Вроде так должно получиться
Код
C++ (Qt)
void TPEICombo::paintEvent(QPaintEvent* event) {
 QStyleOptionComboBox option;
 option.initFrom(this);
 
 QPainter painter(this);
 painter.save();
 style()->drawComplexControl(QStyle::CC_ComboBox, &option, &painter, this );
 painter.restore();
 ...
 ...
}
 
Записан
Barmaglodd
Гость
« Ответ #10 : Июнь 20, 2009, 09:23 »

Сделал свой делегат для QComboBox, в выпадающем списке делаем свою отрисовку.
Не могу понять, как сделать ту же отрисовку(для выбранного индекса) в строке ввода комбобокса.
+сто тыщь мильёнов

Когда смотрел исходники QComboBox (для 4.4.3), там был QLineEdit, и данные ему тупо через QVariant:toString передавались, тем самым игнорируя делегат и локаль. Переписывать QComboBox не захотел, поэтому в исходниках Qt поправил, как нужно. Если кто-то имеет нормальную реализацию QComboBox, поделитесь Улыбающийся Или с удовольствием приму участие в написании.
Записан
spectre71
Гость
« Ответ #11 : Июнь 20, 2009, 11:42 »

Короче покопался в исходниках и нашел решение.
Код
C++ (Qt)
void TPEICombo::paintEvent(QPaintEvent* event) {
 QStylePainter painter(this);
 painter.setPen(palette().color(QPalette::Text));
 
/* draw the combobox frame, focusrect and selected etc. */
 QStyleOptionComboBox opt;
 initStyleOption(&opt);
 painter.drawComplexControl(QStyle::CC_ComboBox, opt);
 
/* draw the icon and text */
 // ORIGINAL CODE //painter.drawControl(QStyle::CE_ComboBoxLabel, opt);
 
 QRect editRect = style()->subControlRect(QStyle::CC_ComboBox, &opt, QStyle::SC_ComboBoxEditField, this);
 
 // PAINTING IN  editRect  !!!
...
...
}
 

Рисуем в editRect , то что хотим!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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