Russian Qt Forum

Qt => Model-View (MV) => Тема начата: demaker от Декабрь 26, 2013, 13:24



Название: Model-View при работе с model-view
Отправлено: demaker от Декабрь 26, 2013, 13:24
Вот работаю с Model-View-(View Model).

Добавляю элементы в дерево.
Отображаю их в общей структуре ,и при выделении элемента в дереве, отображаются его дочки в листе.

Иногда происходит так, что при добавлении элемента в общую структуру он не отображается.
А вот в листе виден.

Добавляем в общую структуру:

Код
C++ (Qt)
//---------Global------------------
QModelIndex currentModelIndex;
CommonElement *currentElement;
//--------------------------------
 
void MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
  ...
  currentElement = NULL;
 
 
   root = new QObject(this);
   base = new Base(root);
 
   Delegate *mydelegate = new Delegate(this);
 
   treeview = new TreeView(this);
   treemodel = new TreeModelBrowser(root);
   treeview->setModel(treemodel);
   treeview->setEditTriggers(QAbstractItemView::DoubleClicked);
   treeview->setItemDelegate(mydelegate);
 
   listview = new ListView(this);
   listmodel = new ListModelBrowser();
   listmodel->initRoot(base);
   listview->setModel(listmodel);
 
   connect(treeview,SIGNAL(appendChildTree(QModelIndex)),treemodel,SLOT(updateModelInsertRow(QModelIndex)));
   connect(treeview,SIGNAL(appendChildList(QModelIndex)),listmodel,SLOT(setRoot(QModelIndex)));
   connect(this,SIGNAL(appendChild(QModelIndex)),treemodel,SLOT(updateModelInsertRow(QModelIndex)));
   ...
}
 
void MainWindow::appendElement()
{
   qDebug()<<"appendElement";
   if(currentElement != NULL)
   {
       Q_EMIT appendChild(currentModelIndex);        
       listmodel->setRoot(currentModelIndex);
   }
}
 
void TreeModelBrowser::updateModelInsertRow(QModelIndex index)
{
   if(index.isValid())
   {
       int row = index.row();
       row++;
       beginInsertRows(index,row,row);
       CommonElement *ce = reinterpret_cast<CommonElement*>(index.internalPointer());
       ce->appendChild();    
       endInsertRows();
   }
}
 
void ListModelBrowser::setRoot(QModelIndex index)
{
   if(index.isValid())
   {
       QObject *obj = reinterpret_cast<QObject*>(index.internalPointer());
       beginResetModel();
       root = obj;
       endResetModel();
   }
}
 

может не может отобразить, добавленный элемент?


Название: Re: Model-View при работе с model-view
Отправлено: Bepec от Декабрь 26, 2013, 13:43
Непонятно что вы ожидаете? Что по отрывку кода найдут ошибку? Или что по скриншоту, отображающему хз какое (по всей видимости нормально работающее ) приложение?

И вообще непонятно какой элемент не виден и при добавлении куда? Элемент верхнего уровня или "дочка"? При каких условиях это происходит?

PS *замечание по поводу "может не может отобразить, добавленный элемент?"*


Название: Re: Model-View при работе с model-view
Отправлено: demaker от Декабрь 27, 2013, 10:59
И вообще непонятно какой элемент не виден и при добавлении куда? Элемент верхнего уровня или "дочка"? При каких условиях это происходит?

Извините, если плохо пояснил.
Да дочку.

В базу(Base), добавляем станцию(MyStation) - дочка.
Кликаем один раз на базу, и жмем на плюсик - добавляем дочку.
Иногда, происходит так, что в правом окне(ListView) при добавлении элемента, он отображается.
А в левом окне(TreeView) нет.
Код
C++ (Qt)
 
//---------Global------------------
QModelIndex currentModelIndex;
CommonElement *currentElement;
//--------------------------------
 
void MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
  ...
  currentElement = NULL;
 
 
   root = new QObject(this);
   base = new Base(root);
 
   Delegate *mydelegate = new Delegate(this);
 
   treeview = new TreeView(this);
   treemodel = new TreeModelBrowser(root);
   treeview->setModel(treemodel);
   treeview->setEditTriggers(QAbstractItemView::DoubleClicked);
   treeview->setItemDelegate(mydelegate);
 
   listview = new ListView(this);
   listmodel = new ListModelBrowser();
   listmodel->initRoot(base);
   listview->setModel(listmodel);
 
   ui->mainToolBar->addAction(QIcon("D:/images/green_plus.png"),"append element",this,SLOT(appendElement()));
   connect(this,SIGNAL(appendChild(QModelIndex)),treemodel,SLOT(updateModelInsertRow(QModelIndex)));  
   ...
}
 
void MainWindow::appendElement()
{
   qDebug()<<"appendElement";
   if(currentElement != NULL)
   {
       Q_EMIT appendChild(currentModelIndex);        
       listmodel->setRoot(currentModelIndex);
   }
}
 

Код
C++ (Qt)
 
void TreeModelBrowser::updateModelInsertRow(QModelIndex index)
{
   if(index.isValid())
   {
       int row = index.row();
       row++;
       beginInsertRows(index,row,row);
       CommonElement *ce = reinterpret_cast<CommonElement*>(index.internalPointer());
       ce->appendChild();    
       endInsertRows();
   }
}
 

Код
C++ (Qt)
void ListModelBrowser::setRoot(QModelIndex index)
{
   if(index.isValid())
   {
       QObject *obj = reinterpret_cast<QObject*>(index.internalPointer());
       beginResetModel();
       root = obj;
       endResetModel();
   }
}
 


Название: Re: Model-View при работе с model-view
Отправлено: Bepec от Декабрь 27, 2013, 12:24
Подытожим.
Имеется tree модель.

Имеется treeView и listView, которые к ней цепляются.
У treeView имеется делегат.

При выборе элемента treeView происходит сцепление listView с текущим отцовским элементом.

Иногда в treeView элемента нет, а в listView он отображается.

Выводы:
1) в модели данные имеются (listView корректно отображает)
2) в treeView делегат не отображает данные (или не получает сигналов от модели)
3) или же treeView не обновляется при добавлении.

Что делать:
1) Сужаем круг. Ставим в делегате точку остановки (или вывод в консоль) и пытаемся воссоздать ситуацию. Если непонятно, то при добавлении у нас в консоли должно быть что-то типа
Код:
model                  - элемент "тата" добавлен
myDelegate         - элемент "тата" добавлен
listModelBrowser - элемент "тата" добавлен

2) выяснив какой гад не отвечает в данной ситуации ставим там контрольные точки, проверяем все условия выхода из функций и прочее.

3) Проблема решена