Название: 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) Проблема решена
|