Ich versuche, Qt C++ - Code zu schreiben, der mit QML-Objekten interagiert. Das Ziel besteht darin, dass Zeichenfolgen an einem TCP-Socket empfangen werden, der an ein Textprotokoll auf der GUI angehängt wird. Jedes Mal, wenn eine neue Zeichenfolge empfangen wird, führe ich die Funktion appendText() aus. Ich habe eine Implementierung dieser derzeit arbeiten, die QWidgets und eine .ui-Datei verwendet. Ich brauche eine identische QML-Implementierung. Meine QWidget-Implementierung verwendet einen TextBrowser und die Append-Funktion wie die folgende. "theString" ändert sich, wenn das Programm ausgeführt wird und jede Änderung angehängt wird, wodurch das Textprotokoll gefüllt wird.Warum hängt meine QML textArea nicht an?
//update the text log with data received on TCP socket
void MainWindow::appendText() {
ui->textBrowser->append(theString);
}
Das gibt mir das gewünschte Ergebnis, jede Zeichenfolge in das Textfeld anhängt wie sie hereinkommen. Die Ausgabe wie folgt aussehen sollte.
Control connection successful.
Data connection successful.
Control Packet Receieved:
1
Control Packet Receieved:
2
Control Packet Receieved:
3
Control Packet Receieved:
4
Control Packet Receieved:
1
Control Packet Receieved:
2
Control Packet Receieved:
3
Control Packet Receieved:
4
Wenn jedoch das tun, was ich glaube, die gleiche Funktion mit einem QML-Objekt mit dem folgenden Code sein ...
//update the text log with data received on TCP socket
void MainWindow::appendText() {
QMetaObject::invokeMethod(textbox, "append", Qt::DirectConnection, Q_ARG(QVariant, theString));
//QQmlProperty(textbox, "text").write(theString);
}
Es wird nur die ersten beiden Strings anhängt, und nicht mehr darüber hinaus . Die Ausgabe sieht stattdessen so aus.
Ich habe die Dokumentation zum Aufruf von QML-Methoden in C++ ausgiebig durchgesehen und habe immer noch kein Glück gehabt. Jede Hilfe wird geschätzt. Vielen Dank für Ihre Zeit.
Danke für die Antwort. Wenn ich das Update mit QString versuchen erhalte ich diesen Fehler: QMetaObject :: InvokeMethod: Keine solche Methode TextArea_QMLTYPE_31 :: append (QString) Kandidaten sind: append (QVariant) ... ich ziemlich sicher bin, die ersten beiden Nachrichten werden nicht mit einer anderen Methode gedruckt, weil die Funktion appendText(), die ich habe, die einzige ist, in der ich tatsächlich etwas in die GUI schreibe. Ich werde in der Zwischenzeit einen signalbasierten Ansatz versuchen. – 9tm09
Welche Qt/QML-Version verwenden Sie? Verwenden Sie den eingebauten 'TextArea'? Wie erhalten Sie 'textbox' in C++? Sind Sie sicher, dass 'MainWindow :: appendText' korrekt aufgerufen wird? – m7913d
Ich verwende Qt Creator 4.2.1. Ich verwende ein TextArea-Objekt in meiner QML-Datei. Das TextArea-Objekt ist das untergeordnete Objekt eines GroupBox-Objekts. Ich erhalte Textbox, indem ich diese Zeile tue: textbox = groupBox2-> findChild ("networkStatus"); ..... Auch ich benutze QMetaObject: invokeMethod, wo es eine Methode namens append für TextArea Objekte gibt –
9tm09