0

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..

Antwort

1

Wenn ich ein Modell aus dem nonGui-Thread sende, sind einige Signale verloren gegangen, weil der Modellzeiger und die zugehörigen Daten falsch sind, wenn ich mich nicht irre. Auch QStandardItemModel - ist ein Teil von Qt5Gui und es ist nicht threadsafe. Das bedeutet, dass Modell und Ansicht im GUI-Thread gesammelt werden sollen und Daten vom Worker-Thread gesendet und im GUI-Thread an das Modell gebunden werden müssen. Es ist nicht einfach in meiner Situation - Ich habe einen großen Baum und ich möchte nicht meine eigene Struktur für die Analyse des Baumes erstellen - aber es ist ein "wahrer Weg"). Ich verwende einfachere Entscheidung - Ich sende nur den Elternzeiger auf das neue Modell im GUI-Thread - und es funktioniert. Wenn jemand weiß, wie Baumstruktur von Worker Thread einfach zu senden - bitte teilen Sie es in diesem Thread) In jedem Fall - mit Text-repräsentierten Datentransfer zwischen Threads - seine bevorzugte Methode (wie JSON/XML ... jede sich selbst Darstellung , basierend auf Indizes von Artikeln, aufgeführt in `` QList> `etc ...)

0

Haben Sie das versucht?

+0

Thx, aber es funktioniert nicht .. –

+0

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? –

+0

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