Qt Model-View данные и модель в отдельном потоке

Раньше я спрашивал о запуске модели и представления в разных темах, и теперь я понимаю, в чем проблема. Чтобы обойти проблему, я думал о дублировании данных. Когда данные изменяются рабочим потоком, он одновременно отправляет обновление в поток GUI/Model, чтобы обновить модель теми же данными (поэтому существует точная копия данных с GUI/моделью).

Звучит как правдоподобный подход? Другой метод - использовать прямые виджеты с моделями по умолчанию, такими как QTableWidget и т. Д., Но тогда мне нужно делать много вещей, которые по умолчанию работают с QTableView.

Пожалуйста, предложите!

Ссылка на другой вопрос: Шаблон проектирования, Qt Модель/представление и несколько потоков


person shiv chawla    schedule 20.03.2012    source источник
comment
Звучит неплохо. Вы можете использовать соединения сигнала/слота в очереди для обновлений. Если у вас нет огромного количества обновлений или копировать данные очень дорого, я не вижу проблемы. Если рабочему процессу не нужно хранить существующие данные, он может просто отправить обновления и забыть, чтобы избежать дублирования использования ОЗУ.   -  person Frank Osterfeld    schedule 20.03.2012


Ответы (1)


Возможны 2 сценария, но в любом случае вам понадобятся как минимум 2 объекта:

Объект данных

Содержит все функции, необходимые для обслуживания и управления данными. Данные хранятся в указателях на объекты, описывающие данные. Структуры данных для этого я оставлю на ваше усмотрение.

Модель

Содержит вектор указателей на отображаемые данные.

Сценарий 1

Данные в QTableView отображаются только в том случае, если для сигнала QTimer или другого сигнала хранилище данных блокируется, а вектор для отображаемой модели вырезается и помещается в модель, а reset() вызывается для QTableView перерисовки с помощью новые данные.

Сценарий 2

Вы можете управлять данными с помощью пользовательских ItemEditor в QTableView. В этом случае верхний виджет, который имеет QTableView, должен иметь ссылки на ваш объект данных и QTableView, а также обработчик сигнала для сигнала, испускаемого ItemEditor, когда редактирование завершено. Затем этот обработчик сигнала заблокирует структуру данных внутри объекта данных и обновит ее. После этого он может вырезать новый вектор для отображения, но чаще всего этого делать не нужно.

Как вы будете настраивать блокировку, поиск и т. д., зависит только от вас.

person Karlson    schedule 20.03.2012