Название: Не обновляется вид QTableView при изменении модели. Emit dataChanged() есть. Отправлено: xintrea от Август 21, 2015, 17:03 По какой-то причине не могу увидеть строки в QTableView. Вид отображает модель, унаследованную от QAbstractTableModel.
В модели, в методе setData(), вызываю emit dataChanged(): Код: bool AttachTableModel::setData(const QModelIndex &index, const QVariant &value, int role) При отладке вижу, что данные в модели обновляются: Код: Set new data to AttachTableModel with rows: 2 Так же сделал специальную кнопочку чтобы проверять что там у модели установлено. Она тоже показывает при нажатии 2 строки: Код: void AttachTableController::onInfo(void) В консоли вижу: Код: 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="Запись с приаттаченными файлами"> 6. Снова запустить, кликнуть на измененную запись; 7. Кликнуть на кноку со скрепкой; 8. Наблюдать пустой список файлов; 9. Кликнуть на кнопку Attach Info; 10. Увидеть в консоли надпись: Код: Model row: 2 Да, после изменения xml файла, в самой программе ничего нелья добавлять/удалять/редактировать. Только смотреть. Так как xml-файл перезапишется, и в нем измененные строки исчезнут (функционал еще не доделан). Название: Re: Не обновляется вид QTableView при изменении модели. Emit dataChanged() есть. Отправлено: Old от Август 21, 2015, 18:51 Вьюшка не перечитывает просто так кол-во строк/столбцов модели, для этого модель должна посылать специальные сигналы. Одним dataChanged здесь не обойтись. Или используйте reset.
Название: Re: Не обновляется вид QTableView при изменении модели. Emit dataChanged() есть. Отправлено: Bepec от Август 21, 2015, 19:17 Есть сигналы
beginInsert beginInsertRow beginInsertColumn beginRemoveRows beginRemoveColumns (ну и их версии с end******) Для добавления их надо посылать с правильными аргументами. dataChanged - сигнал об изменении УЖЕ существующих данных. beginInsert - сигналы о добавлении. beginRemove - сигналы об удалении. PS правда там индексы правильно передавать надо, я в своей модели разбирался с ними минут 20. Название: Re: Не обновляется вид QTableView при изменении модели. Emit dataChanged() есть. Отправлено: xintrea от Август 21, 2015, 21:57 Вьюшка не перечитывает просто так кол-во строк/столбцов модели, для этого модель должна посылать специальные сигналы. Одним dataChanged здесь не обойтись. Или используйте reset. В общем, проще всего оказалось обернуть смену данных в модели вызовами beginResetModel()/endResetModel(): Код: beginResetModel(); Название: Re: Не обновляется вид QTableView при изменении модели. Emit dataChanged() есть. Отправлено: Авварон от Август 23, 2015, 11:09 Код: QModelIndex stopIndex=createIndex(table->size() - 1, ATTACH_COLUMNS-1 ); |