2011-01-07 2 views
1

Ich habe zuvor ein ähnliches Problem in this question gelöst, wo ich fragte, wie eine QMessageBox von einem nicht GUI-Thread in Qt laufenden C-Code anzuzeigen.Getting QInputDialog :: GetText() Ergebnis von C-Code in Nicht-GUI-Thread ausgeführt

Die Lösung, die ich vorgeschlagen wurde, zu verwenden, um Signale & Slots und ein Qt :: QueuedConnection ein Signal zu verbinden, die durch den C-Code Aufruf eine C++ Funktion, die wiederum so genannten C++ Methode meiner Haupt GUI-Fenster emittiert werden könnten, die dann emittierte das Signal, funktioniert gut für QMessageBoxes.

Allerdings muss ich jetzt in der Lage sein, Eingaben von einem QInputDialog von dem C-Code anzufordern, der im Nicht-GUI-Thread ausgeführt wird.

Ich habe darüber nachgedacht, den folgenden Slot Code und nach dem gleichen Prinzip wie oben beschrieben:

void MyWidget::prompt_slot(QString str, QString &answer) 
{ 
    answer = QInputDialog::getText(0, "", str); 
} 

und Qt :: BlockingQueuedConnection, so dass der Schlitz den Verweis auf eine Zeichenfolge ändert, dass ich dann zugreifen der C-Code.

Leider bekomme ich die folgende Laufzeitfehler:

QObject::connect: Cannot queue arguments of type 'QString&' 
(Make sure 'QString&' is registered using qRegisterMetaType().) 

Was mache ich falsch? Wird durch Annäherung sogar funktionieren? Wenn nicht, was sollte ich verwenden?

Vielen Dank für Ihre Antwort.

Antwort

2

Es sollte funktionieren, wenn Sie QString* anstelle von QString& verwenden. Sie müssen möglicherweise auch QString* als Metatyp registrieren - oder, wenn Sie nicht damit belästigt werden können, stattdessen void* verwenden und hin und her werfen.

+0

Nun, das war einfach, mit einem Zeiger anstelle einer Referenz funktioniert. Vielen Dank! – houbysoft