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

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

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: Частое добавление и удаление строки в QAbstractTableModel  (Прочитано 19632 раз)
Bepec
Гость
« Ответ #30 : Февраль 14, 2016, 13:35 »

Увы вы исчерпали свои отмазки в конкретно данном случае) Ну да бог с вами Веселый
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #31 : Февраль 14, 2016, 13:46 »

Увы вы исчерпали свои отмазки в конкретно данном случае) Ну да бог с вами Веселый
Напротив, я даже создал новую тему для Вашего обучения Улыбающийся А здесь хороший, полезный топик, не будем его захламлять
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #32 : Февраль 14, 2016, 19:02 »

В данном случае Igors прав, может быть случай, когда количество рядов рассинхронизуется между моделью и вью. Это как если кидать beginInsertRows() после того, как данные поменялись - попробуйте, много интересного словите.
Записан
Bepec
Гость
« Ответ #33 : Февраль 14, 2016, 19:30 »

Я специально пробовал (и неспециально) когда овладевал model-view. Стандартная связка modelView защищенная мутексами с собственным контейнером работает стабильно без всяких вылетов. Да, возможно мерцания, возможны лишние "левые" строки, но они были результатом неправильно отосланных сигналом - всем известных пар "begin insert remove update".

Собственно шаблон model-View Qt-шной полностью соответствует стандарту - model рулит данными в любой форме, view же НЕ МОЖЕТ вызвать ошибку в модели, если не пропущены элементарные проверки.
Записан
YvenTitan
Самовар
**
Offline Offline

Сообщений: 174


Просмотр профиля
« Ответ #34 : Февраль 15, 2016, 16:29 »

Может не совсем в тему.
Я попробовал отказаться от работы с моделью в другой нитке. Сделал так, что в отдельной нитке испускаются сигналы раз в миллисекунду. Результат остался тот же. Поэтому решил продолжить решение Igors. Добавил модель, которая наследуется от QSortFilterProxyModel. В итоге зависает при попытке удалить элемент, в методе removeRows, в строке m_rowList.removeAt(row). Со старой проблемой эта, скорее всего не связана.
Ошибка не такая сложная, но за день не получилось ее решить.
Если не сложно, можете подсказать, где может быть недочет?
« Последнее редактирование: Февраль 15, 2016, 16:41 от YvenTitan » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #35 : Февраль 15, 2016, 17:38 »

Добавил модель, которая наследуется от QSortFilterProxyModel. В итоге зависает при попытке удалить элемент, в методе removeRows, в строке m_rowList.removeAt(row).
У меня не виснет а сразу летит. Использовал предложение Верес'а - пофиг ветер, если индекс невалиден, то data() возвращает пустой QVariant  Улыбающийся
Код
C++ (Qt)
if (index.row() >= 0 && index.row() < m_rowList.size())  // Вересовщина :-)
   if(role == Qt::DisplayRole){
       return QVariant(m_rowList.at(index.row()).at(index.column()));
 
Так вроде "побежало", но такое решение считаю несерьезным и безграмотным, и Вам его не советую.

Почему бы не сделать "обертку" для контейнера?  Рабочая нитка не удаляет, а увеличивает счетчик удаленных (или хранит индексы удаленных если можно удалять в любом порядке). Добавлять добавляет но rowCount возвращает старое значение. Разумеется все это тоже защищено локами. В итоге обе нитки работают с 1 контейнером, но модель какое-то время показывает его старую копию. Потом (хоть по таймеру) главная нитка посылает самой себе сигнал по которому (опять-таки под защитой лока) делается removeRows, удаленные реально удаляются, и insertRows. Все совершенно легально, и (на первый взгляд) несложно
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #36 : Февраль 15, 2016, 17:41 »

Сделал так, что в отдельной нитке испускаются сигналы раз в миллисекунду. Результат остался тот же.
IMHO, лучше разобраться с этим вариантом. Выкладывайте ваш проект. 
Записан
YvenTitan
Самовар
**
Offline Offline

Сообщений: 174


Просмотр профиля
« Ответ #37 : Февраль 16, 2016, 11:12 »

Спасибо, Igors. Мне этот метод тоже помог. Пока оставлю его, хоть он и "колхозный".

Old, выкладываю свой вариант с сигналами
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #38 : Февраль 16, 2016, 17:55 »

Old, выкладываю свой вариант с сигналами
Ну, вы особо ничего не изменили, по прежнему перемещаете модель в контекст другого потока...
Сделайте класс Sensor, это будет имитатор сенсора. Создайте несколько объектов этого класса, пусть они будут выполняться в отдельных потоках и генерируют сигнал newData.
Модель должна находится в контексте GUI-потока и иметь слот для модификации (добавление/удаление). Соедините сигналы сенсоров со слотом модели и все заработает.
Желательно сразу продумать систему группировки строк: добавлять строки сразу пачками. Пользовать все равно не может увидить добавление строки раз в несколько миллисекунд, для него они будут добавляться пачками.
« Последнее редактирование: Февраль 16, 2016, 17:57 от Old » Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


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