Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Icoz от Июль 23, 2007, 16:28



Название: [qt4.3.0] Проблема с моделью на основе QAbstractTableModel
Отправлено: Icoz от Июль 23, 2007, 16:28
В общем хочу сделать следующее: есть treeview с категориями данных(там название, еще кое-что), есть сами данные для listview - соответственно пишу 2 разных модели.
Пишу модель по следующей схеме:
Код:
class Node1 { //категории данных
...
List<Node1*> list1; // участвует в построении дерева
List<Node2*> list2; // просто данные для данного элемента - потом пойдут в listview (в model2)
}
struct Node2{...} // сами данные

Есть 2 модели:
Код:
Model1 : public QAbstractItemModel  - к ней претензий нет, идет в treeview
{Node1* rootnode;}
Model2 : public QAbstractTableModel - с ней проблема, для listview
{QList<node2*> data;
void setNewData(QList<node2*> new_data);}

По клику на TreeView вызывается метод модели2 для смены данных согласно выбранной категории:
вызов(который почему-то не всегда вызывается!):
Код:
void CMainWindow::on_treeview_clicked(const QModelIndex &index){
  Node1* node = model1->nodeFromIndex(index);
  if (node)
    model2->setNewData(node->list2);
}

реализация:
Код:
void Model2::setNewData(QList<node2 *> new_data)
{
  // вариант 1 - не работает, как надо
  this->disks.clear();
  this->disks << new_disks;
  // вариант 2 - не работает, как надо
  this->disks = new_disks;
  // общая часть
  reset();
}

Теперь сама проблема:
Когда нажимаю мышкой на элемент treeview, в котором находятся 2 элемента, обновляется listview - все ок. Затем выбираю другой элемент с дочерними 3-мя элементами - тоже ок.
А если переключаться с категории с 2-мя на категорию опять же с двумя доченими элементами типа node2, то listview не обновляется. Уже чего только не пробовал... Не понимаю причин столь выборочного обновления - обновлятся только тогда, когда я переключаюсь между категориями с разным количеством элементов.
Если чего не ясно - спрашивайте, формулировка у меня расплывчатая получилась...


Название: [qt4.3.0] Проблема с моделью на основе QAbstractTableModel
Отправлено: SABROG от Июль 23, 2007, 17:20
Наверно косяк где-то в nodeFromIndex


Название: [qt4.3.0] Проблема с моделью на основе QAbstractTableModel
Отправлено: Icoz от Июль 23, 2007, 18:40
Код:
node2* Model2::nodeFromIndex(const QModelIndex &index) const
{
  if (index.isValid()){
    return data.at(index.row());
  }
  else
    return 0;
}


добавлено спустя 7 минут:

 
Цитата: "SABROG"
Наверно косяк где-то в nodeFromIndex

Да нет! Проблема в том, что on_treeview_clicked не всегда вызывается!!!
Я жму мышой по элементу, у меня стоит брейкпоинт на функции, но он не каждый раз выскакивает! То есть сама эта функция не каждый раз вызывается.
Хотя если и косяк, то в setNewData. Но эта функция вызывается реже чем должна.
И еще, я в доке прочитал, что сигнал clicked посылается только, если index.isValid() == true! То есть не каждое мое нажатие мышкой можно описать валидным индексом?

добавлено спустя 5 минут:

 Оп-па! Попробовал в винде - все нормально! Обрабатывается КАЖДЫЙ клик!
Значит глюк связан только с линой! Никто не знает, в багах это не числится?

PS. Сей глюк наблюдал в openSuse 10.2 [qt4.2.1] и Kubuntu 7.04 [qt4.3.0]
В винде qt4.3.0 - глюка нет


Название: Re: [qt4.3.0] Проблема с моделью на основе QAbstractTableModel
Отправлено: Icoz от Сентябрь 17, 2007, 23:15
Проблема решена:
Код:
connect( treeview->selectionModel(), SIGNAL( currentChanged(const QModelIndex &,const QModelIndex &) ), this, SLOT( on_treeview_currentChanged(const QModelIndex &,const QModelIndex &) ) );
Самое главное - внимательнее с currentRowChanged у treeview->selectionModel()! Он вызывается только при смене номера строки, несмотря на то, что меняется родитель индекса! Короче, он не подходит для древовидной модели!!!