Russian Qt Forum

Qt => Вопросы новичков => Тема начата: carhun от Июль 12, 2012, 21:41



Название: QTreeView/Widget and CSS
Отправлено: carhun от Июль 12, 2012, 21:41
Добрый день.

Хотел бы, что бы в QTreeView/Widget'e в первом столбике рисовался поверха текста кружочек, соотв. для этого я так понимаю мне нужно использовать CSS. Делаю так:
Код:
 QTreeView::item {
    width: 100px;
    height: 100px;
    background: red;
    -moz-border-radius: 50px;
    -webkit-border-radius: 50px;
    border-radius: 50px;
 }

Соотв. этот CSS рисует для всех колонок, как можно сделать, что бы оно рисовало кружек только для одной колонки?

Прилагаю ui файл для дизайнера для теста ...

Спасибо за внимание.


Название: Re: QTreeView/Widget and CSS
Отправлено: andrew.k от Июль 12, 2012, 23:47
QItemDelegate или QStyleItemDelegate


Название: Re: QTreeView/Widget and CSS
Отправлено: carhun от Июль 13, 2012, 09:49
Добрый день!

А сам допустим кружочек я так понимаю могу сделать только используя CSS или есть еще какой-то способ?
Делагат, я так понял мне нужн только для того, что бы сделать, что бы этот кружок рисовался в первом столбике?


Название: Re: QTreeView/Widget and CSS
Отправлено: Пантер от Июль 13, 2012, 09:51
В делегате ты можешь рисовать все, что тебе хочется.


Название: Re: QTreeView/Widget and CSS
Отправлено: carhun от Июль 13, 2012, 10:44
Т.е. рисовать вот эти дуги, к-ые я прилагаю в файлике, это все можно сделать в делигате? или тут надо что-то вида:
Код:
 QTreeView::branch:has-siblings:!adjoins-item {
     border-image: url(stylesheet-vline.png) 0;
 }

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

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

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

 QTreeView::branch:open:has-children:!has-siblings,
 QTreeView::branch:open:has-children:has-siblings  {
         border-image: none;
         image: url(stylesheet-branch-open.png);
 }
Если да, то спасибо за помощь и я пошел разбираться с делегатами...

Просто я пытаюсь в делигате делать вот так:
Код:
void Delegate::drawDecoration(QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect, const QPixmap &pixmap) const
{
    QPixmap pix(100, 100);

    pix.fill(Qt::red);
    QItemDelegate::drawDecoration(painter, option, option.rect, pix);
}
Так тогда получается то он рисуется только для одной строчки и когда я раскрою дерево, то оно автоматом не нарисует , т.к. я нарисовал на картинке...


Название: Re: QTreeView/Widget and CSS
Отправлено: andrew.k от Июль 13, 2012, 13:44
Делегат - это механизм рисования ячейки (в твоем случае).
Когда вьюхе необходимо отрисовать ячейку (любую), она обращается к делегату.
А уже твой делегат может решать как рисовать ту или иную ячейку, т.к. у него есть ее индекс.
Ты можешь вообще все ячейки рисовать по-разному.


Название: Re: QTreeView/Widget and CSS
Отправлено: carhun от Июль 13, 2012, 15:31
Смотрите, значит сделал пока, что так:

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

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

и тогда как видно на рисунке, получается что вот для первой строки, когда я раскрываю он полностью до конца не дорисовывает прямоугольник...
Для того, что он дорисовал надо ему самому сказать, что option.rect.setBottomLeft(QPoint(x1,y1)) ? Если да, то тогда получается мне надо узнать если ли у моей первой строки child'ы - это я так понимаю можно сделать исходя из индекса, но как тогда исходя из индекса узнать сколько места он занимает? Ведь получается мне надо взять, у первой строки пройтись по child'м, и когда дошел до последнего взять его координаты конца и соотв. уставноить y1 = y посл. child'a?
Тогда он нарисует все правильно, как я до этого рисовал на картинке...

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

Соотв. как мне поступить?