Russian Qt Forum

Qt => Вопросы новичков => Тема начата: once_again_abc от Сентябрь 19, 2011, 09:37



Название: QComboBox - текст айтемов разными цветами
Отправлено: once_again_abc от Сентябрь 19, 2011, 09:37
как это можно сделать самым простым способом?


Название: Re: QComboBox - текст айтемов разными цветами
Отправлено: BRE от Сентябрь 19, 2011, 09:38
как это можно сделать самым простым способом?
Делагатом.


Название: Re: QComboBox - текст айтемов разными цветами
Отправлено: once_again_abc от Сентябрь 19, 2011, 09:47
как это можно сделать самым простым способом?
Делагатом.

зашибись ответ, очень помогает новичку  ;D   так торопились, что даже ошибку в слове сделали =)))


Название: Re: QComboBox - текст айтемов разными цветами
Отправлено: BRE от Сентябрь 19, 2011, 09:56
зашибись ответ, очень помогает новичку  ;D   так торопились, что даже ошибку в слове сделали =)))
Я тебе направление показал. :)
Посмотри примеры, почитай про QItemDelegate. Или можно в самой моделе обрабатывать роль Qt::TextColorRole.
Так понятней.  ::)


Название: Re: QComboBox - текст айтемов разными цветами
Отправлено: GreatSnake от Сентябрь 19, 2011, 10:11
Можно и без делегатов:
Код
C++ (Qt)
#include <QApplication>
#include <QComboBox>
#include <QStandardItemModel>
 
int main( int argc, char** argv )
{
QApplication app( argc, argv );
 
QComboBox cb;
char *colors[] = { "brown", "orange", "yellow", "green", "lightblue", "blue", "purple" };
QStandardItemModel* m = qobject_cast< QStandardItemModel* >( cb.model() );
 
m->setRowCount( 7 );
for( int i = 0; i < 7; i++ )
{
QModelIndex mi = m->index( i, 0 );
m->setData( mi, colors[i], Qt::DisplayRole );
m->setData( mi, QColor( colors[i] ), Qt::TextColorRole );
m->setData( mi, QColor( colors[i] ), Qt::DecorationRole );
}
 
cb.show();
return app.exec();
}
 


Название: Re: QComboBox - текст айтемов разными цветами
Отправлено: once_again_abc от Сентябрь 19, 2011, 10:31
что-то не работает у меня последний вариант.
в конструкторе родителя-виджета создаю динамически CheckBoxList( QWidget *widget ) : QComboBox(widget)
затем 32 раза addItem

в обработчике CheckBoxList::paintEvent(QPaintEvent *)

делаю так:

Код:
    

QStandardItemModel* m = qobject_cast< QStandardItemModel* >( this->model() );

for( int i = 0; i < 32; i++ )
{
QModelIndex mi = m->index( i, 0 );
                m->setData( mi, QColor(255,0,255), Qt::ForegroundRole );
}

ПС. что такое модель/данные в кьюте пока не знаю, сегодня только начну изучать эту тему так что прошу не пугать меня сейчас этими словами =)


Название: Re: QComboBox - текст айтемов разными цветами
Отправлено: GreatSnake от Сентябрь 19, 2011, 10:38
Цитировать
что-то не работает у меня последний вариант.
Что значит не работает? Это 100% работающий пример.

Цитировать
ПС. что такое модель/данные в кьюте пока не знаю, сегодня только начну изучать эту тему так что прошу не пугать меня сейчас этими словами =)
Так вот возьми и научись сначала, чтобы не писать такие глупости.


Название: Re: QComboBox - текст айтемов разными цветами
Отправлено: once_again_abc от Сентябрь 19, 2011, 10:45
Так вот возьми и научись сначала, чтобы не писать такие глупости.

вот эта фраза и есть самая настоящая глупость.


Название: Re: QComboBox - текст айтемов разными цветами
Отправлено: GreatSnake от Сентябрь 19, 2011, 10:52
Так вот возьми и научись сначала, чтобы не писать такие глупости.

вот эта фраза и есть самая настоящая глупость.

Чтобы говорить здесь о глупости, надо хотя бы немного иметь представление о чём идёт речь.
Меняя данные в модели данных ниспадающего списка в методе отрисовки комбобокса ты делаешь такую глупость, что даже не смешно...


Название: Re: QComboBox - текст айтемов разными цветами
Отправлено: once_again_abc от Сентябрь 19, 2011, 11:19
Так вот возьми и научись сначала, чтобы не писать такие глупости.

вот эта фраза и есть самая настоящая глупость.

Чтобы говорить здесь о глупости, надо хотя бы немного иметь представление о чём идёт речь.
Меняя данные в модели данных ниспадающего списка в методе отрисовки комбобокса ты делаешь такую глупость, что даже не смешно...

мне самому не смешно, поэтому я и задаю здесь вопросы, для кого-то возможно глупые и смешные.
на изучение делегатов/моделей уйдет время, а я надеялся получить здесь решение, которое я смогу использовать прямо сейчас. если бы я уже знал что такое делегаты и как использовать модели для кастомизации кьютишных элементов то меня бы здесь не было с такими вопросами. очевидно.


Название: Re: QComboBox - текст айтемов разными цветами
Отправлено: GreatSnake от Сентябрь 19, 2011, 11:24
Я тебе дал 100% работающий пример. В чём проблемы?
Зачем ты в paintEvent() делаешь установку цвета текста ???
Это нужно делать хотя бы в конструкторе. Хотя мне непонятно зачем ты создаёшь свой класс.


Название: Re: QComboBox - текст айтемов разными цветами
Отправлено: Rem Norton от Сентябрь 19, 2011, 11:34
2 once_again_abc:
1. Если решил использовать Qt, то лучше сразу забудь все, что знал о MFC, Delphi и т.д. Тут все по-человечески сделано :)
2. GreatSnake дал 100% рабочий код, не требующий изменений. Ctrl+C, Ctrl+V и все.
3. Когда задаешь вопрос, слушай ответ.


Название: Re: QComboBox - текст айтемов разными цветами
Отправлено: Странник от Сентябрь 19, 2011, 12:39
есть вопрос в тему. как изменить цвет фона элемента в выпадающем списке QComboBox мне понятно (рис. 1). но цвет фона текущего элемента остается по умолчанию (рис. 2). как бы увязать их поизящнее?


Название: Re: QComboBox - текст айтемов разными цветами
Отправлено: Rem Norton от Сентябрь 19, 2011, 12:44
Это делается через styleSheet непосредственно виджета, но я, пардон, не помню точно как.


Название: Re: QComboBox - текст айтемов разными цветами
Отправлено: Странник от Сентябрь 19, 2011, 13:00
Это делается через styleSheet непосредственно виджета, но я, пардон, не помню точно как.
я помню = ) но тайно надеюсь, что есть решение лучше, чем по сигналу currentIndexChanged менять stylesheet для виджета в зависимости от BackgroundRole текущего элемента..


Название: Re: QComboBox - текст айтемов разными цветами
Отправлено: GreatSnake от Сентябрь 19, 2011, 13:13
Код
C++ (Qt)
#include <QApplication>
#include <QComboBox>
#include <QStandardItemModel>
#include <QStylePainter>
 
class ComboBox : public QComboBox
{
public:
ComboBox( QWidget* p = 0 ) : QComboBox( p ) {}
 
protected:
void paintEvent( QPaintEvent* )
{
QModelIndex mi = model()->index( currentIndex(), 0 );
QPalette pal = palette();
 
QVariant v = mi.data( Qt::BackgroundRole );
if( v.isValid() )
pal.setColor( QPalette::Button, qvariant_cast< QColor >( v ) );
v = mi.data( Qt::ForegroundRole );
if( v.isValid() )
pal.setColor( QPalette::ButtonText, qvariant_cast< QColor >( v ) );
 
QStylePainter painter( this );
 
QStyleOptionComboBox opt;
initStyleOption( &opt );
opt.palette = pal;
 
painter.drawComplexControl( QStyle::CC_ComboBox, opt );
painter.drawControl( QStyle::CE_ComboBoxLabel, opt );
}
};
 
int main( int argc, char** argv )
{
QApplication app( argc, argv );
 
ComboBox cb;
char *colors[] = { "brown", "orange", "yellow", "green", "lightblue", "blue", "purple" };
QStandardItemModel* m = qobject_cast< QStandardItemModel* >( cb.model() );
 
m->setRowCount( 7 );
for( int i = 0; i < 7; i++ )
{
QModelIndex mi = m->index( i, 0 );
m->setData( mi, colors[i], Qt::DisplayRole );
QColor c = QColor( colors[i] );
m->setData( mi, c, Qt::BackgroundRole );
m->setData( mi, QColor( qGray( c.rgb() ) < 128 ? Qt::white : Qt::black ), Qt::ForegroundRole );
m->setData( mi, c, Qt::DecorationRole );
}
 
cb.show();
return app.exec();
}