Поиск:

Ответ в темуСоздание новой темы Создание опроса
> QTreeWidget/View и его украшение 
:(
    Опции темы
newbie2009
Дата 14.7.2012, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 8.2.2009

Репутация: нет
Всего: нет



Добрый день!

Собственно, что я хочу получить изображено на рисунке:
http://s1.ipicture.ru/Gallery/Viewfull/11853402.html

Соотв. для начала вопрос как это вообще лучше сделать:
1. Определив свой делегат и там в методе paint делать как-то так:
Код

void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    painter->drawRect(option.rect);

    QItemDelegate::paint(painter, option, index);
}

 И соотв. получаю вот такое:
http://s1.ipicture.ru/Gallery/Viewfull/11853470.html
 Но тогда получается, что если у TreeWidgetItem'a есть дети, то тогда прямоугольник не будет дорисовавываться до конца и тогда на каждом шаге надо как-то дорисовывать линию....

2. Как-то для этого использовать CSS, пробывал для этого из док-ов взять след:
Код

 QTreeView::branch:has-siblings:!adjoins-item {
     border-image: url(vline.png) 0;
 }

 QTreeView::branch:has-siblings:adjoins-item {
     border-image: url(branch-more.png) 0;
 }

 QTreeView::branch:!has-children:!has-siblings:adjoins-item {
     border-image: url(branch-end.png) 0;
 }

 QTreeView::branch:has-children:!has-siblings:closed,
 QTreeView::branch:closed:has-children:has-siblings {
         border-image: none;
         image: url(branch-closed.png);
 }

 QTreeView::branch:open:has-children:!has-siblings,
 QTreeView::branch:open:has-children:has-siblings  {
         border-image: none;
         image: url(branch-open.png);
 }

 Но в этом случаи, оно не получается так, что бы строчка охватывалась полностью,как нарисовано на 1м рисунке. Может я что-то не правильно делаю или в данном случаи CSS не подойдет.

Как мне поступить, может поможете примера кода, если кто уже подобное делал.

Спасибо за внимание. 
Буду рад любой помощи.

PM MAIL   Вверх
math64
Дата 14.7.2012, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Что хочешь получить - не очень понятно. Сграбрен экран и мышкой начеряканы линии.
paint лучше писать так (чтобы поддерживался текущий стиль виджетов)
Код

void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    if(...) { // Нужна своя отрисовка
            QStyleOptionViewItemV4 opt = option;
            initStyleOption(&opt, index);
            // Правим данные в opt
            // например:
            opt.backgroundBrush = QBrush(Qt::red);
            opt.text = "MyText";
            ...
            QStyle *style = opt.widget ? opt.widget->style() : QApplication::style();
            style->drawControl(QStyle::CE_..., &opt, painter, opt.widget);
            return;
    }
    QStyledItemDelegate::paint(painter, option, index);
}


PM   Вверх
newbie2009
Дата 14.7.2012, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 8.2.2009

Репутация: нет
Всего: нет



Цитата

Сграбрен экран и мышкой начеряканы линии.

Вот я хочу что бы именно они и рисовались эти начеряканные линии.

Я хочу, что бы каждый QTreeWidgetItem был нарисован в прямоугольнике с закругленным слева краями...
Но при этом, если я раскрою QTreeWidgetItem и у него там есть дети, то, что бы этот прямоуголник был как бы общий для всех детей и на каждом в частности отдельно.

До отрытия:
-------------
| + item1 |
-------------

После открытия:
------------------
| - item1         |
|       ----------  |
|       |  item1| |
|       ----------  |
----------------- -

Вот посмотритет этот пример. Видете для самого верхнего элемента прямоугольник не дорисован, а я хочу, что бы он был дорисован и еще охаватывал вложенный в него Item

вот такое надо - http://forums.arm.com/uploads/monthly_03_2...19727_thumb.png
http://www.youtube.com/watch?v=LgRHpRI6C_4

Или это все лучше делать не используя QTreeWidget вообще? Может какой-то другой компонент подойдет или вообще надо писать свой?

Это сообщение отредактировал(а) newbie2009 - 14.7.2012, 23:15

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  tes.zip 29,92 Kb
PM MAIL   Вверх
math64
Дата 15.7.2012, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Видимо, придётся писать свой класс, производный от QTreeView (лучше QTreeView, а не QTreeWidget) и переопределять методы 
Код

    void paintEvent(QPaintEvent *event);

    void drawTree(QPainter *painter, const QRegion &region) const;
    virtual void drawRow(QPainter *painter,
                         const QStyleOptionViewItem &options,
                         const QModelIndex &index) const;
    virtual void drawBranches(QPainter *painter,
                              const QRect &rect,
                              const QModelIndex &index) const;


см. исходники QTreeView
Высота строк будет зависеть от того, есть ли дочерние узлы, свернуты или развернуты они и глубины вложения, поэтому:
Код

setUniformRowHeights(false);

предстоит довольно сложная работа.

Добавлено через 8 минут и 41 секунду
По возможности, используй стили. Первая колонка таблицы должна выглядеть как закладки QTabWidget, расположенные слева.
Но у QTabWidget не предумотренно размещение закладок одна внутри другой.
PM   Вверх
newbie2009
Дата 15.7.2012, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 8.2.2009

Репутация: нет
Всего: нет



Это мне получается надо как-то подсовывать нужный мне option внутри переопределннеых ф-ии, к-ые написаны в предищем посте?
Т.е. в переопределенной ф-ии, я как-то коректирую option,а потом делаю QTreeView::drawRow(...,myOption, ...) . Правильно?

Или надо брать полностью код из исходников Qt, вставлять в свои переоперделенный ф-ии и там что-то переделывать?

Или вначале вызывать ф-ии базового класса, а потом дорисовывать все что мне надо?



Это сообщение отредактировал(а) newbie2009 - 15.7.2012, 13:35
PM MAIL   Вверх
math64
Дата 15.7.2012, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Да, нужно смотреть исходники, и переlделывать под себя.
Если получится - используй стили, если нет - рисуй напрямую в painter.
Колонки начиная со второй, можно рисовать как в базовом классе (но с учётом что высота строки увеличилась).
Если сделать
Код

setIndentation(0);

то и при прорисовке первой колонке получишь доступ ко всему пространству первой колонки, и можно попробовать прорисовать делегатом, но тогда со стилями не получится - соответствующий Tab при раскрытом узле занимает несколько ячеек.
Возможно, лучше добавить вертикальный заголовок (у стандартного дерева есть только горизонтальный, а у таблицы есть оба) и рисовать Tab'ы в нём.

При пользовании стилями, нужно найти текущий стиль, заполнить объект QStyleOption (свой для каждого примитива и комплекного контрола), для табов - QStyleOptionTabV3, QStyleOptionTabBarBaseV2, QStyleOptionTabWidgetFrameV2
и вызвать drawPrimitive(),  drawControl() или drawComplexControl()
Примитивы для табов:
        PE_FrameTabWidget,
Для контролы для табов
        CE_TabBarTab, CE_TabBarTabShape, CE_TabBarTabLabel.
Метрики для табов - pixelMetric()
        PM_TabBarTabOverlap,
        PM_TabBarTabHSpace,
        PM_TabBarTabVSpace,
        PM_TabBarBaseHeight,
        PM_TabBarBaseOverlap,

PM   Вверх
spyswamp
Дата 25.7.2012, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 18.8.2006

Репутация: 1
Всего: 7



QStyledItemDelegate + QSS. Читай доки, извращайся как душе угодно. Хоть треугольные строки с зубчатыми краями делай.


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0771 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.