0

Я начал загрузку базы данных в не-GUI потоке с QtCuncurrent :: бежать. В этом nonGui нить я должен создать QStandardItemModel * и после этого я получил модель в GUI потоке сQStandardItemModel * от не-GUI поток не был `испускает itemChanged сигнала

model = modelWatcher.result(); 

на QFutureWatcher закончил сигнал(). Он работает довольно хорошо (пользовательский интерфейс построен успешно), но элемент itemChanged() не выделяется при изменении данных элемента (состояние флажка изменено). Когда я создаю модель в потоке графического интерфейса, конфликтов нет. Подключение работает без утверждают не удается:

bool ok = connect(model, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(onFolderStateChanged(QStandardItem*)), static_cast<Qt::ConnectionType>(Qt::UniqueConnection)); 
Q_ASSERT(ok); 

Как я могу видеть в that thread (нет примеров кода, и я понял основную идею), я не могу создать модель (часть Qt5Gui) в nonGui потоке. Но это работает для меня! Ui устроится) Кроме того, я должен объявить отослано типа с:

qRegisterMetaType<QStandardItemModel*>("QStandardItemModel*"); 

И мои другой посылает как:

qRegisterMetaType<QList<QTreeWidgetItem*> >("QList<QTreeWidgetItem*>"); 

хорошо работает (хотя его тоже Qt5Gui часть).

Я не t understand how can I **get the model from nonGui thread with full functionality** like itemChanged signals? It сек что-то вроде emit mysignal(QStandardItemModel*);? В этом случае, почему другие задачи отлично работают без каких-либо испусканий? в том числе currentChanged сигналы и т. д..

ответ

1

Когда я посылаю модель из nonGui нити, некоторые сигналы были потеряны, так как модель указатель и связанные с ними данные неверны, если я не ошибается. Также QStandardItemModel - это часть Qt5Gui, а не небезопасная. Это означает, что модель и представление должны собираться в потоке графического интерфейса, а данные должны отбираться из рабочего потока и привязываться к модели в потоке графического интерфейса. Это не просто в моей ситуации - у меня есть большое дерево, и я не хочу создавать свою собственную структуру для разбора дерева, но это «истинный способ»). Я использую более простое решение - Я просто отправляю указатель parentItem на новую модель в потоке графического интерфейса - и он работает. Если кто-нибудь знает, как отправить структуру дерева из рабочего потока простого - пожалуйста, сообщите нам в этой теме) В любом случае - с использованием текста представлены передач данных между потоками - его более предпочтительным методом (например, JSON/XML ... любым себе представление , основанный на индексах элементов, перечисленных в `` QList> `и т. д.)

0

Вы пробовали это?

bool ok = connect(model, SIGNAL(itemChanged(QStandardItem*)), this, 
SLOT(onFolderStateChanged(QStandardItem*)), 
static_cast<Qt::ConnectionType>(Qt::AutoConnection | Qt::UniqueConnection)); 
+0

Thx, но он не работает .. –

+0

Может быть, мне нужно сделать model-> moveToThread (this-> thread()); или что-то другое.. ? Если я создам модель в потоке пользовательского интерфейса, мне нужно отправить все зависящие данные в поток GUI из рабочего потока, правильно ли это? –

+0

В самом деле, если вы хотите, чтобы ваш слот будет выполняться в отдельном потоке, не GUI, нить подход рабочей Рекоммендуемый, как описано здесь http://doc.qt.io/qt-5/qthread.html – Scab

Смежные вопросы