Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: jasf от Ноябрь 09, 2009, 00:27



Название: QStyle::CE_ItemViewItem
Отправлено: jasf от Ноябрь 09, 2009, 00:27
Здравствуйте. :) Подскажите, пожалуйста, как отрисовать фрейм QStyle::CE_ItemViewItem. Пытался по разному.. вот к примеру:

Код:
	QStyleOptionViewItemV4 option;
option.initFrom(this);
option.state |= QStyle::State_HasFocus;
option.state |= QStyle::State_MouseOver;

option.palette.setCurrentColorGroup(QPalette::Normal);

option.state |= QStyle::State_Selected;
option.rect = QRect(20,10,200,200);
option.direction = Qt::LeftToRight;
        style()->drawControl(QStyle::CE_ItemViewItem, &option, &painter, this);

но ничего, кроме пустоты, отрисовать не получилось (точнее - отрисовываются некие точечки высотой в 10 пикселей).

а хочется отрисовать фрейм (серый под "test"), который видно на скрине. Заранее спасибо за советы.


Название: Re: QStyle::CE_ItemViewItem
Отправлено: Rcus от Ноябрь 09, 2009, 07:41
QStyle::PE_PanelItemViewItem


Название: Re: QStyle::CE_ItemViewItem
Отправлено: jasf от Ноябрь 09, 2009, 12:08
Код:
void QMyLabel::paintEvent(QPaintEvent* e)
{
//QLabel::paintEvent(e);
QPainter painter(this);
QRect rect(QRect(QPoint(),size()));
QStyleOptionViewItemV4 option;
option.initFrom(this);
option.state |= QStyle::State_HasFocus;
option.state |= QStyle::State_MouseOver;

option.palette.setCurrentColorGroup(QPalette::Normal);

option.state |= QStyle::State_Selected;
option.rect = QRect(20,10,200,200);
option.direction = Qt::LeftToRight;
style()->drawPrimitive(QStyle::PE_PanelItemViewItem, &option, &painter, this);
}

вообще пусто (нет даже точек)


Название: Re: QStyle::CE_ItemViewItem
Отправлено: Rcus от Ноябрь 09, 2009, 12:48
Нет времени попробовать, но мне кажется что вышеприведенный код не инициализирует некоторые члены класса QStyleOptionViewItemV4 (в частности ::backgroundBrush), поэтому ничего и не рисуется


Название: Re: QStyle::CE_ItemViewItem
Отправлено: jasf от Ноябрь 09, 2009, 14:05
Ну да. dirty hack ввиде создания экземпляра QListWidget и получения из него viewOptions() позволяет нормально отрисовываться. видимо пока так и оставлю :)


Название: Re: QStyle::CE_ItemViewItem
Отправлено: jasf от Ноябрь 10, 2009, 02:18
промучался весь вечер, но так ничего вразумительного и не реализовал. То, что описал в предыдущем посте - это на Windows Xp было просто выделение(видимо некий стандартный стиль). Под вистой по прежнему не работает.


Название: Re: QStyle::CE_ItemViewItem
Отправлено: Rcus от Ноябрь 10, 2009, 04:47
В Qt нет магии :) Вот как выглядит кусок $QTDIR/src/gui/styles/qwindowsvistastyle.cpp
Код
C++ (Qt)
   case PE_PanelItemViewItem:
       {
           const QStyleOptionViewItemV4 *vopt;
           const QAbstractItemView *view = qobject_cast<const QAbstractItemView *>(widget);
           bool newStyle = false;
 
           if (const QListView *listview = qobject_cast<const QListView *>(widget)) {
               if (listview->viewMode() == QListView::IconMode)
                   newStyle = true;
           } else if (qobject_cast<const QTreeView *>(widget)) {
               newStyle = true;
           }
           if (newStyle && view && (vopt = qstyleoption_cast<const QStyleOptionViewItemV4 *>(option))) {
//...
           } else {
               QWindowsXPStyle::drawPrimitive(element, option, painter, widget);
           }
           break;
       }


Название: Re: QStyle::CE_ItemViewItem
Отправлено: jasf от Ноябрь 10, 2009, 11:05
да вчера я и с этим кодом ознакомился :) получилось отрисовать фрейм при помощи передачи в последний параметр указателя на QListWidget. Но фрейм получился не полупрозрачным (хоть и vista style). Когда разберусь, в чём же дело - отпишусь.

P.S. а ведь заявлено, что в Qt 4.x всё реализовано так, что бы можно было отрисовывать содержимое одного виджета в другие без надобности создания первого. А тут такие вот ifы проверки на типизацию виджета. Типа если ты не от QAbstractItemView, тогда ты не из нашей песочницы и соответственно неимеешь права отрисовывать элементы Itemов.