Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: bess от Октябрь 12, 2009, 16:31



Название: Размеры последнего itemWidget в QTreeWidget
Отправлено: bess от Октябрь 12, 2009, 16:31
Надо сделать компонент дерево с несколькими вложенными уровнями таких же деревьев
(http://lh6.ggpht.com/_FPmgqkpHzik/StMp2PCqDiI/AAAAAAAAAbs/sK2RNzqsB-A/test.jpg)

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

Можно делать фиктивные _последние_ итемы, а потом их не рисовать - но это как-то некруто )

Собственно, вот.. уже задолбался =) помогите, плиз..

Код:
        // код, который вызывается на itemExpanded() и itemCollapsed()
        // как сделать проще обновление, не понял
        QModelIndex i1 = indexFromItem( topLevelItem(0) )
     , i2 = indexFromItem( topLevelItem(topLevelItemCount()-1) );
dataChanged( i1, i2 );
updateGeometries();

        // дальше находим родительское дерево
TComboTreeItem *item = dynamic_cast<TComboTreeItem*>(topLevelItem(0))
        , *parent = item->customParent;

if( parent )
dynamic_cast<TComboTree*>(parent->treeWidget())->repaintFromParent();

sizeHint() вроде не косячит, размеры правильно считаются

проект под msvc2008, мож глянет кто)


Название: Re: Размеры последнего itemWidget в QTreeWidget
Отправлено: Makss от Октябрь 12, 2009, 18:22
эээ... а можно поинтересоваться, зачем ет вам такой изврат? вы уж извените конечно за ето слово))


Название: Re: Размеры последнего itemWidget в QTreeWidget
Отправлено: panAlexey от Октябрь 12, 2009, 18:26
эээ... а можно поинтересоваться, зачем ет вам такой изврат? вы уж извените конечно за ето слово))
+500, изврат он и в Африке изврат...
пс. Чую запах дельфи....


Название: Re: Размеры последнего itemWidget в QTreeWidget
Отправлено: bess от Октябрь 12, 2009, 20:52
рисовать несколько табличек с разными хедерами

да и, по идее, со стилями более-менее нормально должно выглядеть

не, дельфи непричем =)


Название: Re: Размеры последнего itemWidget в QTreeWidget
Отправлено: CroCIV от Октябрь 13, 2009, 08:43
НЕТ ПОКА ИЗВРАТ
дерево деревьев = дерево, вот еслиб очередной ветвью дерева была бы какая то незамысловатая компонента, например QColorBox - другой вопрос, вообще делается не сложно, а это изврат ))


Название: Re: Размеры последнего itemWidget в QTreeWidget
Отправлено: bess от Октябрь 13, 2009, 14:06
да вроде уже все сделано, и так не сложно.. а что исправить - хз =\


Название: Re: Размеры последнего itemWidget в QTreeWidget
Отправлено: spirit от Октябрь 13, 2009, 14:34
НЕТ ПОКА ИЗВРАТ
дерево деревьев = дерево, вот еслиб очередной ветвью дерева была бы какая то незамысловатая компонента, например QColorBox - другой вопрос, вообще делается не сложно, а это изврат ))

а почему собственно изврат? очень даже ничего если рассватримать подчиненные структуры например в базах данных.
вроде в Accesse такая хрень есть.


Название: Re: Размеры последнего itemWidget в QTreeWidget
Отправлено: MelkorBSD от Февраль 11, 2010, 17:04
Добавил после
Код:
QModelIndex i1 = indexFromItem( topLevelItem(0) )
                , i2 = indexFromItem( topLevelItem(topLevelItemCount()-1) );
dataChanged( i1, i2 );
updateGeometries();

еще и
Код:
for (int i=0;i<topLevelItemCount();i++)
  if (topLevelItem(i)->childCount()>0)
  {
    i1 = indexFromItem(topLevelItem(i)->child(0));
    i2 = indexFromItem(topLevelItem(i)->child(topLevelItem(i)->childCount()-1));
    dataChanged( i1, i2 );
    updateGeometries();
  }

Понятно, что надо это сделать красивее, но принцип думаю ясен - надо выполнить dataChanged и updateGeometries не только между корневыми элементами дерева, но и между всеми остальными.

PS: Хотя я думаю за давностью данной темы Вы этот ответ уже нашли.