Russian Qt Forum

Qt => Model-View (MV) => Тема начата: m_ax от Октябрь 27, 2008, 23:23



Название: [4.2.2] QTreeView + наследник от QAbstractTableModel
Отправлено: m_ax от Октябрь 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

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


Название: Re: [4.2.2] QTreeView + наследник от QAbstractTableModel
Отправлено: ритт от Октябрь 28, 2008, 00:23
QAbstractTableModel не поддерживает родительско-дочерние связи между индексами.
какой эффект ожидается в данном случае?


Название: Re: [4.2.2] QTreeView + наследник от QAbstractTableModel
Отправлено: m_ax от Октябрь 28, 2008, 00:35
QAbstractTableModel не поддерживает родительско-дочерние связи между индексами.
какой эффект ожидается в данном случае?

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


Название: Re: [4.2.2] QTreeView + наследник от QAbstractTableModel
Отправлено: Alex03 от Октябрь 28, 2008, 06:29
Зачем отображать TableModel в QTreeView? Или Вы уверены что Вам нужна именно TableModel ?


Название: Re: [4.2.2] QTreeView + наследник от QAbstractTableModel
Отправлено: m_ax от Октябрь 28, 2008, 10:27
Зачем отображать TableModel в QTreeView? Или Вы уверены что Вам нужна именно TableModel ?


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



Название: Re: [4.2.2] QTreeView + наследник от QAbstractTableModel
Отправлено: Tonal от Октябрь 28, 2008, 11:13
Всё довольно просто: в TableModel игнорируется параметр parent в функции index, ну и в остальных соответственно не проверяется index.parent.
Поэтому, когда QTreeView пытается узнать сколько же детей у конкретного итема, ему возвращается количество строк, и т.д.
А для того, чтобы итем редактировать не могли нужно, по идее, из флага убирать ItemIsEditable.


Название: Re: [4.2.2] QTreeView + наследник от QAbstractTableModel
Отправлено: m_ax от Октябрь 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 то такая же фигня получается...
Спасибо.  :P


Название: Re: [4.2.2] QTreeView + наследник от QAbstractTableModel
Отправлено: ритт от Октябрь 28, 2008, 11:59
если есть какие-то весомые причины на использование табличной модели в связке с тривью, думаю, проще будет из табличной модели сделать некий "гибрид", где будет учитываться парент для индекса и при запросе будут возвращаться соответствующие данные-заглушки (0 для rowCount(parent) и т.п.)
возможно, имеет смысл отписаться по этому поводу Троллям - пусть бы сами заглушили...ну, или хотя бы описали подобное поведение в документации...


Название: Re: [4.2.2] QTreeView + наследник от QAbstractTableModel
Отправлено: Tonal от Октябрь 28, 2008, 21:02
Код:
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) cons
{
    return parent == QModelIndex() ? createIndex(row, column) : QModelIndex();
}