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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Model-View при работе с model-view  (Прочитано 3169 раз)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« : Декабрь 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();
   }
}
 

может не может отобразить, добавленный элемент?
« Последнее редактирование: Декабрь 26, 2013, 13:35 от demaker » Записан
Bepec
Гость
« Ответ #1 : Декабрь 26, 2013, 13:43 »

Непонятно что вы ожидаете? Что по отрывку кода найдут ошибку? Или что по скриншоту, отображающему хз какое (по всей видимости нормально работающее ) приложение?

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

PS *замечание по поводу "может не может отобразить, добавленный элемент?"*
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #2 : Декабрь 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();
   }
}
 
« Последнее редактирование: Декабрь 27, 2013, 11:41 от demaker » Записан
Bepec
Гость
« Ответ #3 : Декабрь 27, 2013, 12:24 »

Подытожим.
Имеется tree модель.

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

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

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

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

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

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

3) Проблема решена
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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