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

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

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

Сообщений: 960


Просмотр профиля
« : Март 21, 2014, 11:39 »

Добавляю элементы в модель
Но почему-то иногда это выполняется сразу нормально,а иногда нет.
Скажите ниже приведенный код правильный или нет?
Код
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();
 
       qDebug()<<"TreeModelBrowser::updateModelInsertRow";
 
   }
}
 
void TreeModelBrowser::updateModelRemoveRow(QModelIndex index)
{
   if(index.isValid())
   {
       int row = index.row();
       QModelIndex parentIndex = index.parent();
       beginRemoveRows(parentIndex,row,row);
       CommonElement *ce = reinterpret_cast<CommonElement*>(index.internalPointer());
       delete ce;
       endRemoveRows();
   }
}
 
Записан
UltraPenguin
Гость
« Ответ #1 : Март 24, 2014, 09:58 »

Я думаю было бы проще Вам подсказать, если было бы уточнение фразы
Цитировать
иногда это выполняется сразу нормально,а иногда нет.
а также что делают функции
Код:
beginInsertRows(index,row,row);
и
Код:
endInsertRows();
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #2 : Март 24, 2014, 11:34 »

а также что делают функции
Код:
beginInsertRows(index,row,row);
и
Код:
endInsertRows();

Код:
void QAbstractItemModel::beginInsertRows ( const QModelIndex & parent, int first, int last ) [protected]

Begins a row insertion operation.
When reimplementing insertRows() in a subclass, you must call this function before inserting data into the model's underlying data store.
The parent index corresponds to the parent into which the new rows are inserted; first and last are the row numbers that the new rows will have after they have been inserted.


void QAbstractItemModel::endInsertRows () [protected]

Ends a row insertion operation.
When reimplementing insertRows() in a subclass, you must call this function after inserting data into the model's underlying data store.
« Последнее редактирование: Март 24, 2014, 11:44 от demaker » Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #3 : Март 24, 2014, 13:22 »

Цитировать
иногда это выполняется сразу нормально,а иногда нет.

Т.е я хочу добавить в модель еще один элемент, но чтобы не перезагружать ее (т.е без reset());
Чтобы не тыкать лишний раз на указатель вложенности(стрелочка);
Но это не каждый раз срабатывает.
Элемент добавляется, но не отображается в окне.
Записан
Bepec
Гость
« Ответ #4 : Март 24, 2014, 14:31 »

С высоты своего опыта скажу, "не работает". Точнее не у вас всё плохо проходит, а просто ваше "добавление" совпадает с каким-то сигналом обновления View Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Март 24, 2014, 14:52 »

А так пробовали?
Код
C++ (Qt)
void TreeModelBrowser::updateModelInsertRow( const QModelIndex & index )
{
   if(index.isValid())
   {
       CommonElement *ce = dynamic_cast<CommonElement*>(index.internalPointer());
       if (ce)
         ce->appendChild();    
       else
         Q_ASSERT(0);  
   }
}
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #6 : Март 24, 2014, 14:57 »

А так пробовали?
Код
C++ (Qt)
void TreeModelBrowser::updateModelInsertRow( const QModelIndex & index )
{
   if(index.isValid())
   {
       CommonElement *ce = dynamic_cast<CommonElement*>(index.internalPointer());
       if (ce)
         ce->appendChild();    
       else
         Q_ASSERT(0);  
   }
}

Попробовал, но не помогает
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #7 : Март 24, 2014, 15:12 »

С высоты своего опыта скажу, "не работает". Точнее не у вас всё плохо проходит, а просто ваше "добавление" совпадает с каким-то сигналом обновления View Улыбающийся

И что делать?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #8 : Март 24, 2014, 15:22 »

И что делать?
Странно. Попробуйте для проверки другой View использовать, например, QTableView.
У меня модели обновляются асинхронно, при изменении SQL-таблиц. Вроде всегда все нормально было.
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #9 : Март 24, 2014, 15:43 »

И что делать?
Странно. Попробуйте для проверки другой View использовать, например, QTableView.
У меня модели обновляются асинхронно, при изменении SQL-таблиц. Вроде всегда все нормально было.

Непонимающий Смысл другой view ?
У меня в модель добавляется элемент, но почему-то не отображается, либо сама модель не обновляется - надо нажать на указатель вложенности, чтобы свернуть, затем еще раз, чтобы раскрыть и тогда я могу увидеть добавленный элемент.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #10 : Март 24, 2014, 15:52 »

Непонимающий Смысл другой view ?
Смысл в том, что у меня все работает: строки появляются, обновляются, удаляются.
Модели - свои, в качестве гляделки используется QTableView.

Вот я вам и предлагаю набросать простую модель и погонять его с разными гляделками, что бы понять, кто неправ - вы или Qt. Улыбающийся
Записан
Bepec
Гость
« Ответ #11 : Март 24, 2014, 15:55 »

Я давно свои модели крутил, помню что там задача в beginInsertRows правильном. Поиграйтесь с индексом и строками.
Записан
_OLEGator_
Гость
« Ответ #12 : Март 24, 2014, 15:59 »

Код
C++ (Qt)
void QAbstractItemModel::beginInsertRows ( const QModelIndex & parent, int first, int last ) [protected]
Судя по коду ты неправильно задаешь parent в функции updateModelInsertRow, причем в updateModelRemoveRow ты используешь корректный parent:
Код
C++ (Qt)
QModelIndex parentIndex = index.parent();
« Последнее редактирование: Март 24, 2014, 16:01 от _OLEGator_ » Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #13 : Март 24, 2014, 16:21 »

Код
C++ (Qt)
void QAbstractItemModel::beginInsertRows ( const QModelIndex & parent, int first, int last ) [protected]
Судя по коду ты неправильно задаешь parent в функции updateModelInsertRow, причем в updateModelRemoveRow ты используешь корректный parent:
Код
C++ (Qt)
QModelIndex parentIndex = index.parent();

т.е надо делать так

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

Но почему? Ведь я добавляю элемент, и парентом уже является  
Код:
CommonElement *ce = reinterpret_cast<CommonElement*>(index.internalPointer());
и индекс парента
Код:
 
index
Или нет???
Объясните пожалуйста Улыбающийся
« Последнее редактирование: Март 24, 2014, 16:27 от demaker » Записан
_OLEGator_
Гость
« Ответ #14 : Март 24, 2014, 16:30 »

Это я тебе должен объяснять, как работает твой код?
Ты мне лучше объясни, почему в одном случае используешь QModelIndex parentIndex = index.parent(), а в другом нет, хотя функции beginInsertRows и beginRemoveRows имеют одинаковую сигнатуру и одинаково требуют parent в качестве первого параметра.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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