Ich habe gestartet Datenbank in Nicht-GUI-Thread mit QtCuncurrent :: run geladen. In diesem nonGui Gewinde muss ich QStandardItemModel * Erstellen und danach empfangenen I-Modell in GUI-Thread mitQStandardItemModel * von Nicht-GUI-Thread didn't itemChanged-Signal ausgegeben
model = modelWatcher.result();
auf QFutureWatcher beendet() -Signal. Es funktioniert gut (UI wurde erfolgreich aufgebaut), aber das itemChanged() - Signal wird nicht bei Änderungen der Artikeldaten ausgegeben (Checkbox-Status geändert). Wenn ich das Modell im GUI-Thread erstelle, gibt es keine Kollisionen. Schließen Sie arbeitet ohne Assertion fehlschlägt:
bool ok = connect(model, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(onFolderStateChanged(QStandardItem*)), static_cast<Qt::ConnectionType>(Qt::UniqueConnection));
Q_ASSERT(ok);
Wie ich sehe in that thread (es keine Codebeispiele sind und ich das falsch verstanden die Hauptidee) Ich kann nicht Modell (Teil Qt5Gui) in nonGui Thread zu erstellen. Aber es funktioniert für mich! Ui builded ist) Auch muss ich mit sended Art erklären:
qRegisterMetaType<QStandardItemModel*>("QStandardItemModel*");
Und meine anderen sendet wie:
qRegisterMetaType<QList<QTreeWidgetItem*> >("QList<QTreeWidgetItem*>");
gut funktioniert (obwohl seine auch Qt5Gui Teil).
ich don t understand how can I **get the model from nonGui thread with full functionality** like itemChanged signals? It
s so etwas wie emit mysignal(QStandardItemModel*);
? In diesem Fall, warum andere Aufgaben ohne Ems gut funktioniert? einschließlich currentChanged Signale usw..
Thx, aber es funktioniert nicht .. –
Vielleicht muss ich modell-> moveToThread (This-> thread()); oder etwas anderes.. ? Wenn ich das Modell im UI-Thread erstellen werde, muss ich alle abhängigen Daten vom Worker-Thread an den GUI-Thread senden. Ist es richtig? –
In der Tat, wenn Sie möchten, dass Ihr Slot in einem separaten nicht-GUI-Thread ausgeführt wird, wird der Worker-Thread-Ansatz empfohlen, wie hier beschrieben http://doc.qt.io/qt-5/qthread.html – Scab