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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [4.2.2] QTreeView + наследник от QAbstractTableModel  (Прочитано 7300 раз)
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« : Октябрь 27, 2008, 23:23 »

Привет всем!

Любопытная вещь получается: когда я создаю свою модель, унаследованную от QAbstractTableModel,
а затем записываю её в QTreeView и вызываю метод setEditTriggers(QAbstractItemView::NoEditTriggers):
Код:
QAbstractTableModel *myModel = new QAbstractTableModel(this);
...
QTreeView treeView = new QTreeView;
treeView->setModel(myModel);
treeView->setEditTriggers(QAbstractItemView::NoEditTriggers);
...
то при двойном щелчке мыше на любом item'е в column == 0 под этим элементом выпадает список из элементов этой же колонке (см рис ниже):

column == 0

item 0
item 1
item 2 <-- щёлкаем мышкой на этом итеме (для примера) и под ним разворачивается вся колонка : (
 +item0
 +item1
 +item2
 +item3
 +item4
item3
item4

Никто не знает в чём дело? И как с этим бороться?
Заранее спасибо.
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
ритт
Гость
« Ответ #1 : Октябрь 28, 2008, 00:23 »

QAbstractTableModel не поддерживает родительско-дочерние связи между индексами.
какой эффект ожидается в данном случае?
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #2 : Октябрь 28, 2008, 00:35 »

QAbstractTableModel не поддерживает родительско-дочерние связи между индексами.
какой эффект ожидается в данном случае?

В том то всё и дело, что никакого эфекта и не нужно. Эта модель отображается в большенстве случаях с помощью QTableView и никаких проблем нет, но в одном месте её (модель) нужно отобразить с помощью QTreeView, причём беc возможности редактирования (NoEditTriggers) и в этом случае происходит такая неприятность. Вот, как то так...  В замешательстве 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Alex03
Гость
« Ответ #3 : Октябрь 28, 2008, 06:29 »

Зачем отображать TableModel в QTreeView? Или Вы уверены что Вам нужна именно TableModel ?
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #4 : Октябрь 28, 2008, 10:27 »

Зачем отображать TableModel в QTreeView? Или Вы уверены что Вам нужна именно TableModel ?


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

Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Tonal
Гость
« Ответ #5 : Октябрь 28, 2008, 11:13 »

Всё довольно просто: в TableModel игнорируется параметр parent в функции index, ну и в остальных соответственно не проверяется index.parent.
Поэтому, когда QTreeView пытается узнать сколько же детей у конкретного итема, ему возвращается количество строк, и т.д.
А для того, чтобы итем редактировать не могли нужно, по идее, из флага убирать ItemIsEditable.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #6 : Октябрь 28, 2008, 11:45 »

Всё довольно просто: в TableModel игнорируется параметр parent в функции index, ну и в остальных соответственно не проверяется index.parent.
Поэтому, когда QTreeView пытается узнать сколько же детей у конкретного итема, ему возвращается количество строк, и т.д.
А для того, чтобы итем редактировать не могли нужно, по идее, из флага убирать ItemIsEditable.

В смысле index(...) и parent(...) реализованны так:

Код:
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) cons
{
    return createIndex(row, column);
}

QModelIndex parent(const QModelIndex &index) const
{
    return QModelIndex();
}


так что ли?
Кстати, если из флага убрать ItemIsEditable то такая же фигня получается...
Спасибо.  Показает язык
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
ритт
Гость
« Ответ #7 : Октябрь 28, 2008, 11:59 »

если есть какие-то весомые причины на использование табличной модели в связке с тривью, думаю, проще будет из табличной модели сделать некий "гибрид", где будет учитываться парент для индекса и при запросе будут возвращаться соответствующие данные-заглушки (0 для rowCount(parent) и т.п.)
возможно, имеет смысл отписаться по этому поводу Троллям - пусть бы сами заглушили...ну, или хотя бы описали подобное поведение в документации...
Записан
Tonal
Гость
« Ответ #8 : Октябрь 28, 2008, 21:02 »

Код:
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) cons
{
    return parent == QModelIndex() ? createIndex(row, column) : QModelIndex();
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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