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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не обновляется вид QTableView при изменении модели. Emit dataChanged() есть.  (Прочитано 3453 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Август 21, 2015, 17:03 »

По какой-то причине не могу увидеть строки в QTableView. Вид отображает модель, унаследованную от QAbstractTableModel.

В модели, в методе setData(), вызываю emit dataChanged():
Код:
bool AttachTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
  // Если индекс недопустимый
  if(!index.isValid() && role!=ATTACH_TABLE_DATA_ROLE)
    return false;

  // Если происходит установка ссылки на таблицу с данными
  if(role==ATTACH_TABLE_DATA_ROLE)
  {
    table=value.value<AttachTableDataPointer>();

    QModelIndex startIndex=createIndex(0, 0);
    QModelIndex stopIndex=createIndex(table->size(), ATTACH_COLUMNS-1 );

    qDebug() << "Set new data to AttachTableModel with rows: " << table->size();

    emit dataChanged(startIndex, stopIndex);

    return true;
  }
  ...

При отладке вижу, что данные в модели обновляются:
Код:
Set new data to AttachTableModel with rows: 2

Так же сделал специальную кнопочку чтобы проверять что там у модели установлено. Она тоже показывает при нажатии 2 строки:
Код:
void AttachTableController::onInfo(void)
{
  qDebug() << "Model row: " << model->rowCount();
}

В консоли вижу:
Код:
Model row: 2

Однако вид ничего не показывает. Не пойму почему.

Код проекта: https://github.com/xintrea/mytetra_dev/commit/e627a41b3e18f7472b4364eb443e8c340b537ccb

Как проверить:

1. Запустить;
2. Добавить пару записей (Кнопка "лист с плюсиком");
3. Выяснить, где лежит файл mytetra.xml ( Инструменты-Настройки-Директория с данными-Кнопка [...] );
4. Выйти из mytetra;
5. В файле mytetra.xml преобразовать запись в одну строку:
Код:
<record url="" id="xo18t7c43" dir="rkpqeq2c4" author="" file="text.html" tags="" ctime="20150731162919" name="Запись обычная"/>

К такому виду:
Код:
<record url="" id="xo18t7c43" dir="rkpqeq2c4" author="" file="text.html" tags="" ctime="20150731162919" name="Запись с приаттаченными файлами">
 <files>
  <file id="abc12345" fileName="Архив.zip" type="file"/>
  <file id="defg6789" fileName="Данные.zip" type="file"/>
 </files>
</record>
Note: По стандарту XML при оформлении в виде одного тега, должна быть косая черта в конце тега: "/>". А при оформлении в виде открывающего и закрывающего тега, косой черты в открывающем теге быть не должно.

6. Снова запустить, кликнуть на измененную запись;
7. Кликнуть на кноку со скрепкой;
8. Наблюдать пустой список файлов;
9. Кликнуть на кнопку Attach Info;
10. Увидеть в консоли надпись:

Код:
Model row: 2


Да, после изменения xml файла, в самой программе ничего нелья добавлять/удалять/редактировать. Только смотреть. Так как xml-файл перезапишется, и в нем измененные строки исчезнут (функционал еще не доделан).

Записан

Собираю информацию по крупицам
http://webhamster.ru
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Август 21, 2015, 18:51 »

Вьюшка не перечитывает просто так кол-во строк/столбцов модели, для этого модель должна посылать специальные сигналы. Одним dataChanged здесь не обойтись. Или используйте reset.
Записан
Bepec
Гость
« Ответ #2 : Август 21, 2015, 19:17 »

Есть сигналы
beginInsert
beginInsertRow
beginInsertColumn
beginRemoveRows
beginRemoveColumns
(ну и их версии с end******)

Для добавления их надо посылать с правильными аргументами.

dataChanged - сигнал об изменении УЖЕ существующих данных.
beginInsert - сигналы о добавлении.
beginRemove - сигналы об удалении.

PS правда там индексы правильно передавать надо, я в своей модели разбирался с ними минут 20.
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #3 : Август 21, 2015, 21:57 »

Вьюшка не перечитывает просто так кол-во строк/столбцов модели, для этого модель должна посылать специальные сигналы. Одним dataChanged здесь не обойтись. Или используйте reset.

В общем, проще всего оказалось обернуть смену данных в  модели вызовами beginResetModel()/endResetModel():

Код:
beginResetModel();

// Устанавливается данные переданной по указателю таблицы
table=value.value<AttachTableDataPointer>();
qDebug() << "Set new data to AttachTableModel with rows: " << table->size();

endResetModel();
Записан

Собираю информацию по крупицам
http://webhamster.ru
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #4 : Август 23, 2015, 11:09 »

Код:
QModelIndex stopIndex=createIndex(table->size() - 1, ATTACH_COLUMNS-1 );
?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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