Russian Qt Forum

Qt => Model-View (MV) => Тема начата: nik01a от Сентябрь 08, 2010, 19:02



Название: Не все понятно с setItemDelegateForRow
Отправлено: nik01a от Сентябрь 08, 2010, 19:02
В общем коллеги суть в следующем - на диалоге имеется дерево QTreeWidget:
Код:
QTreeWidgetItem *rootItem = new QTreeWidgetItem(treeWidget);
QTreeWidgetItem *item = new QTreeWidgetItem(rotItem);
QTreeWidgetItem *item1 = new QTreeWidgetItem(item, ...);
QTreeWidgetItem *item2 = new QTreeWidgetItem(item, ...);
QTreeWidgetItem *item3 = new QTreeWidgetItem(item, ...);

затем для элементов item1 - item3 устанавливаю делегат, юзая метод setItemDelegateForRow
Код:
MyItemDelegate* d = new MyItemDelegate(this);
for(int i=0; i<3; i++)
{
treeWidget->setItemDelegateForRow(i+2, d);
}

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


Название: Re: Не все понятно с setItemDelegateForRow
Отправлено: Kolobok от Сентябрь 08, 2010, 19:13
Убери +2


Название: Re: Не все понятно с setItemDelegateForRow
Отправлено: nik01a от Сентябрь 08, 2010, 19:16
+2 здесь нужна для дела, так как я устанавливаю делегаты только для трех последних итемов в иерархии, первые 2 подветви остаются как есть.


Название: Re: Не все понятно с setItemDelegateForRow
Отправлено: BRE от Сентябрь 08, 2010, 19:19
А так?
Код
C++ (Qt)
for( int i = 0; i < 3; i++ )
{
MyItemDelegate *d = new MyItemDelegate( this );
treeWidget->setItemDelegateForRow( i+2, d );
}
 


Название: Re: Не все понятно с setItemDelegateForRow
Отправлено: nik01a от Сентябрь 08, 2010, 19:22
пробовал - результат тот же. В асистенте по этому поводу инфы кот наплакал.


Название: Re: Не все понятно с setItemDelegateForRow
Отправлено: Kolobok от Сентябрь 08, 2010, 19:41
Делегат устанавливается для строки, неважно как глубоко в дереве она находится. Ты пытаешся установить делегата для строк 3-5, хотя их у тебя всего три.


Название: Re: Не все понятно с setItemDelegateForRow
Отправлено: nik01a от Сентябрь 08, 2010, 20:14
а узловые строки rootItem и item разве не считаются? -с ними 5 получается


Название: Re: Не все понятно с setItemDelegateForRow
Отправлено: nik01a от Сентябрь 08, 2010, 20:19
+ а если добавить еще один итем верхнего уровня, а в него напихать подитемов, то как тогда этим строкам задать свой вид делегата? как считать ряды?


Название: Re: Не все понятно с setItemDelegateForRow
Отправлено: Kolobok от Сентябрь 08, 2010, 20:21
Посмотри Model Classes в ассистенте. Все станет понятно.

Все, что тебе нужно, можно реализовать в делегате.


Название: Re: Не все понятно с setItemDelegateForRow
Отправлено: nik01a от Сентябрь 08, 2010, 21:14
почитал... совсем запутался
допутим мы имеем дерево:
Код:
topLevelItem1
  |-----item1
  |-----item2
topLevelItem2
  |-----anotherItem1
  |-----anotherItem2

и для строк item1, item2 я хочу задать делегат MyDelegate, юзаю функции
setItemDelegateForRow(0, ...)
setItemDelegateForRow(1, ...)
а теперь для строк anotherItem1 и anotherItem2 я хочу задать другой делегат MyAnotherDelegate
получается номер строки у них будет совпадать с номером  строк для item1,2 и новый делегат заменит предыдущий,
как тогда быть???


Название: Re: Не все понятно с setItemDelegateForRow
Отправлено: Kolobok от Сентябрь 08, 2010, 22:13
как тогда быть???

Реализовать все в одном делегате. Можно так:
Код:
void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const
{
  ...
  if( index.parent().isValid() )
  {
    if( index.parent().row() == 0 )
      paintRow0( painter, option, index );
    else
      paintRow1( painter, option, index );
  }
  ...
}


Название: Re: Не все понятно с setItemDelegateForRow
Отправлено: nik01a от Сентябрь 08, 2010, 23:09
ну да.. тоже неплохой вариант, спасибо