Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: spectre71 от Июнь 19, 2009, 18:39



Название: QComboBox - отрисовка в строке ввода
Отправлено: spectre71 от Июнь 19, 2009, 18:39
Сделал свой делегат для QComboBox, в выпадающем списке делаем свою отрисовку.
Не могу понять, как сделать ту же отрисовку(для выбранного индекса) в строке ввода комбобокса.

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


Название: Re: QComboBox - отрисовка в строке ввода
Отправлено: BRE от Июнь 19, 2009, 18:47
Как получить из option цвет фонта которым рисовать.
У фонта нет цвета, все цвета находяться в палитре:
QPalette QStyleOption::palette


Название: Re: QComboBox - отрисовка в строке ввода
Отправлено: spectre71 от Июнь 19, 2009, 19:18
У фонта нет цвета, все цвета находяться в палитре:
QPalette QStyleOption::palette
Я спросил как получить цвет фонта(можно сказать для фонта), а не то что у фонта есть цвет.
Мне нужен цвет который я установлю в QPainter::setPen, когда буду ввыводить текст через QPainter::drawText


Название: Re: QComboBox - отрисовка в строке ввода
Отправлено: BRE от Июнь 19, 2009, 19:53
Я спросил как получить цвет фонта(можно сказать для фонта), а не то что у фонта есть цвет.
Мне нужен цвет который я установлю в QPainter::setPen, когда буду ввыводить текст через QPainter::drawText
Посмотри внимательно описание:
enum QPalette::ColorRole
и
const QColor & QPalette::color ( ColorGroup group, ColorRole role ) const


Название: Re: QComboBox - отрисовка в строке ввода
Отправлено: spectre71 от Июнь 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 вытащить нужный цвет.

Ну а самое главное по поводу отрисовки(для выбранного индекса) в строке ввода комбобокса кто знает?


Название: Re: QComboBox - отрисовка в строке ввода
Отправлено: BRE от Июнь 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;


Название: Re: QComboBox - отрисовка в строке ввода
Отправлено: spectre71 от Июнь 19, 2009, 20:39
Короче с палитрой я понял, думал что есть более простой способ.
Я понимаю, когда хочешь чего-то изменить, поиграться со стилями итд. Но получать таким способ текущие цвета по умолчанию - явно перемудрили.


Название: Re: QComboBox - отрисовка в строке ввода
Отправлено: BRE от Июнь 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 );
...
 


Название: Re: QComboBox - отрисовка в строке ввода
Отправлено: spectre71 от Июнь 19, 2009, 21:30
Посмотри еще на QStyle, им можно рисовать, что надо:
Ты имеешь ввиду для отрисовки в строке ввода? Попробую.


Название: Re: QComboBox - отрисовка в строке ввода
Отправлено: spectre71 от Июнь 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();
 ...
 ...
}
 


Название: Re: QComboBox - отрисовка в строке ввода
Отправлено: Barmaglodd от Июнь 20, 2009, 09:23
Сделал свой делегат для QComboBox, в выпадающем списке делаем свою отрисовку.
Не могу понять, как сделать ту же отрисовку(для выбранного индекса) в строке ввода комбобокса.
+сто тыщь мильёнов

Когда смотрел исходники QComboBox (для 4.4.3), там был QLineEdit, и данные ему тупо через QVariant:toString передавались, тем самым игнорируя делегат и локаль. Переписывать QComboBox не захотел, поэтому в исходниках Qt поправил, как нужно. Если кто-то имеет нормальную реализацию QComboBox, поделитесь :) Или с удовольствием приму участие в написании.


Название: Re: QComboBox - отрисовка в строке ввода
Отправлено: spectre71 от Июнь 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 , то что хотим!