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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QStyle::CE_ItemViewItem  (Прочитано 4752 раз)
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"), который видно на скрине. Заранее спасибо за советы.
« Последнее редактирование: Ноябрь 09, 2009, 00:29 от jasf » Записан
Rcus
Гость
« Ответ #1 : Ноябрь 09, 2009, 07:41 »

QStyle::PE_PanelItemViewItem
Записан
jasf
Гость
« Ответ #2 : Ноябрь 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);
}

вообще пусто (нет даже точек)
Записан
Rcus
Гость
« Ответ #3 : Ноябрь 09, 2009, 12:48 »

Нет времени попробовать, но мне кажется что вышеприведенный код не инициализирует некоторые члены класса QStyleOptionViewItemV4 (в частности ::backgroundBrush), поэтому ничего и не рисуется
Записан
jasf
Гость
« Ответ #4 : Ноябрь 09, 2009, 14:05 »

Ну да. dirty hack ввиде создания экземпляра QListWidget и получения из него viewOptions() позволяет нормально отрисовываться. видимо пока так и оставлю Улыбающийся
« Последнее редактирование: Ноябрь 09, 2009, 15:11 от jasf » Записан
jasf
Гость
« Ответ #5 : Ноябрь 10, 2009, 02:18 »

промучался весь вечер, но так ничего вразумительного и не реализовал. То, что описал в предыдущем посте - это на Windows Xp было просто выделение(видимо некий стандартный стиль). Под вистой по прежнему не работает.
Записан
Rcus
Гость
« Ответ #6 : Ноябрь 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;
       }
Записан
jasf
Гость
« Ответ #7 : Ноябрь 10, 2009, 11:05 »

да вчера я и с этим кодом ознакомился Улыбающийся получилось отрисовать фрейм при помощи передачи в последний параметр указателя на QListWidget. Но фрейм получился не полупрозрачным (хоть и vista style). Когда разберусь, в чём же дело - отпишусь.

P.S. а ведь заявлено, что в Qt 4.x всё реализовано так, что бы можно было отрисовывать содержимое одного виджета в другие без надобности создания первого. А тут такие вот ifы проверки на типизацию виджета. Типа если ты не от QAbstractItemView, тогда ты не из нашей песочницы и соответственно неимеешь права отрисовывать элементы Itemов.
« Последнее редактирование: Ноябрь 10, 2009, 11:11 от jasf » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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