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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не все понятно с setItemDelegateForRow  (Прочитано 6850 раз)
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);
}

Но по непонятной причине делегат устанавливается только для последней записи в ветке. В чем может быть проблема?
Записан
Kolobok
Гость
« Ответ #1 : Сентябрь 08, 2010, 19:13 »

Убери +2
Записан
nik01a
Гость
« Ответ #2 : Сентябрь 08, 2010, 19:16 »

+2 здесь нужна для дела, так как я устанавливаю делегаты только для трех последних итемов в иерархии, первые 2 подветви остаются как есть.
Записан
BRE
Гость
« Ответ #3 : Сентябрь 08, 2010, 19:19 »

А так?
Код
C++ (Qt)
for( int i = 0; i < 3; i++ )
{
MyItemDelegate *d = new MyItemDelegate( this );
treeWidget->setItemDelegateForRow( i+2, d );
}
 
Записан
nik01a
Гость
« Ответ #4 : Сентябрь 08, 2010, 19:22 »

пробовал - результат тот же. В асистенте по этому поводу инфы кот наплакал.
Записан
Kolobok
Гость
« Ответ #5 : Сентябрь 08, 2010, 19:41 »

Делегат устанавливается для строки, неважно как глубоко в дереве она находится. Ты пытаешся установить делегата для строк 3-5, хотя их у тебя всего три.
Записан
nik01a
Гость
« Ответ #6 : Сентябрь 08, 2010, 20:14 »

а узловые строки rootItem и item разве не считаются? -с ними 5 получается
Записан
nik01a
Гость
« Ответ #7 : Сентябрь 08, 2010, 20:19 »

+ а если добавить еще один итем верхнего уровня, а в него напихать подитемов, то как тогда этим строкам задать свой вид делегата? как считать ряды?
Записан
Kolobok
Гость
« Ответ #8 : Сентябрь 08, 2010, 20:21 »

Посмотри Model Classes в ассистенте. Все станет понятно.

Все, что тебе нужно, можно реализовать в делегате.
« Последнее редактирование: Сентябрь 08, 2010, 20:28 от Kolobok » Записан
nik01a
Гость
« Ответ #9 : Сентябрь 08, 2010, 21:14 »

почитал... совсем запутался
допутим мы имеем дерево:
Код:
topLevelItem1
  |-----item1
  |-----item2
topLevelItem2
  |-----anotherItem1
  |-----anotherItem2

и для строк item1, item2 я хочу задать делегат MyDelegate, юзаю функции
setItemDelegateForRow(0, ...)
setItemDelegateForRow(1, ...)
а теперь для строк anotherItem1 и anotherItem2 я хочу задать другой делегат MyAnotherDelegate
получается номер строки у них будет совпадать с номером  строк для item1,2 и новый делегат заменит предыдущий,
как тогда быть???
Записан
Kolobok
Гость
« Ответ #10 : Сентябрь 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 );
  }
  ...
}
Записан
nik01a
Гость
« Ответ #11 : Сентябрь 08, 2010, 23:09 »

ну да.. тоже неплохой вариант, спасибо
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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