QApplication In Nicht-Haupt-Thread
Muss ich exec() ein QApplication in einem thread, der nicht main (meine GUIs müssen plugins werden dynamisch geladen und entladen zur Laufzeit, also habe ich keinen Zugriff auf den Haupt-thread). Kennt jemand einen (relativ) schmerzlos Weg, um hack rund um Qt Einschränkung vor ab QApplication außerhalb der main?
Ich entwickle unter Linux mit Qt4 in C++ mit gcc4.3.4.
InformationsquelleAutor rcv | 2010-05-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie mit QThread dann hast du schon die normale Qt-event-loop und kann nur ausführen, exec() in QThread::run () - Funktion. Sie können zwar nicht mit GUI-Objekte außerhalb der Haupt-thread kann man noch mit Ihnen interagieren, durch verzögertem signal/slot-verbindungen. Vielleicht können Sie versuchen, zu speichern Zeiger auf den Haupt-thread QThread-Objekt, und rufen QObject::moveToThread() zu bewegen, Ihre GUI-Objekte zu den wichtigsten Threads, anstatt sich QApplication in einem anderen thread.
Ich denke, es ist keine wirklich gute Idee, zu versuchen, gegen toolkit, mit verschiedenen Arten von hacks und kluges.
Ich fand diese Antwort hilfreich für die Lösung ein anderes problem, aber während der Bewegung QMainWindow Objekt aus einem anderen thread zu Haupt erhielt ich
QObject::moveToThread: Widgets cannot be moved to a new thread
InformationsquelleAutor VestniK
Können Sie beginnen, ein QApplication in einem PThread-wie unten
//main.cpp
//appthread.h
//appthread.cpp
InformationsquelleAutor blueskin
Patch Qt, denke ich, und entfernen Sie den Haupt-thread schauen, und testen, ob das funktioniert für Sie.
Nach
http://bugreports.qt-project.org/browse/QTBUG-7393
das funktioniert nicht auf OS X/Cocoa, obwohl, wie Kakao übernimmt der erste thread erzeugt werden, der main-UI-thread.
InformationsquelleAutor Frank Osterfeld
Ok, ich habe etwas, das funktioniert! Es ist nicht schön, aber es definitiv nicht der job.
Erstellen Sie ein QMainWindow-Derivat, das gesamte GUI-code in es und überlast-Ereignis () - Funktion dieser Klasse zu nennen, das->show()
Erstellen Sie eine Klasse (nennen wir es mal-Runner), die halten wird, ein pointer auf ein QMainWindow-Derivat, und geben Sie es ein run-Funktion.
In der Runner::ein Runner(), startet einen thread aufgerufen Runner::run()
In Runner::run() (die läuft jetzt in einem eigenen thread) konstruieren Sie eine QApplication, und eine Instanziierung Ihre QMainWindow-Derivat. Die exec () - Funktion der QApplication.
Nun, wenn Sie wollen, starten Sie die GUI, nur nach jeder Veranstaltung auf Ihre QMainWindow-Derivat, und es wird sich zeigen!
Diese Lösung scheint sehr gut zu funktionieren in Linux, obwohl es scheint wirklich ausnutzt, manche Lücke in Qt und funktioniert möglicherweise nicht auf anderen Plattformen. Auf jeden Fall einfacher als das patchen von Qt obwohl.
InformationsquelleAutor rcv
Hinzufügen meine 2 Cent mit einem ausgefallenen lambda-und C++ - threads:
Hier
Mainwindow
können IhreQMainWindow
.InformationsquelleAutor PRIME