webentwicklung-frage-antwort-db.com.de

C ++ - Signal an QML-Slot in Qt

Ich möchte ein Signal von C++ an einen Slot in meiner QML-Datei senden. Ich habe es bereits ohne und primitive Typparameter zum Laufen gebracht, aber wenn ich ein QString an meinen QML-Slot senden möchte, erhalte ich eine Fehlermeldung beim Verbindungsaufbau.

Ich verbinde mich in main.cpp

QObject *contentView = rootObject->findChild<QObject*>(QString("contentView"));
QObject::connect(&myObj,      SIGNAL(finishedGatheringDataForItem(QString)), 
                 contentView, SLOT(updateViewWithItem(QString)));

der relevante Teil meiner qml-Datei

Rectangle {
        objectName: "contentView"
        function updateViewWithItem(string) { console.log('got some Items'); }  // slot
}

Error:

Object::connect: No such slot QDeclarativeRectangle_QML_2::updateViewWithItem(QString)
51
alex

Ich denke, es wäre am besten, wenn Sie dieses Tutorial überprüfen:

http://doc.qt.io/qt-4.8/qtbinding.html

vor allem dieser Abschnitt:

http://doc.qt.io/qt-4.8/qtbinding.html#receiving-signals

Ich denke, Ihr Fehler in diesem Fall könnte entweder sein, dass Sie es nicht als Slot deklariert haben oder dass Sie es nicht aufrufbar gemacht haben. Beide Optionen werden im Qt-Tutorial erklärt.

Außerdem müssen Sie eine QVariante verwenden, um Daten zwischen C++ und QML auszutauschen. Sie können auch Typen registrieren, z. Widgets und so weiter, dass Sie sie in QML als "nativen" Typ wie ein Rechteck verwenden können. In den meisten Fällen wird dies nicht empfohlen, es sei denn, Sie benötigen eine bestimmte externe Klasse oder einige Daten, die Sie in Ihrer QML-Schnittstelle sonst nicht anzeigen können.

Der Grund für den QVariant ist der Script-basierte Ansatz von QML. Der QVariant enthält im Wesentlichen Ihre Daten und eine Beschreibung des Datentyps, sodass die QML weiß, wie sie richtig damit umgeht. Aus diesem Grund müssen Sie den Parameter in QML mit String, int usw. angeben. Der ursprüngliche Datenaustausch mit C++ bleibt jedoch eine QVariante

Ich habe den qmlRegisterType schon einmal verwendet, aber es ist eine sehr unpraktische Lösung für einfache Datentypen. Es wird eher für komplexere Daten wie benutzerdefinierte Widgets, Canvas- oder Video-Elemente verwendet, die von QML nicht nativ unterstützt werden, oder für erweiterte QStandardItemModels. Es ist eine bequemere Möglichkeit, Daten zwischen QML und C++ auszutauschen, und benötigt in erster Instanz keine Signale oder Slots, da das QStandardItemModel die GUI automatisch aktualisiert. Um das QStandardItemModel verwenden zu können, müssen Sie den Typ bei qmlRegisterType registrieren. Das Modell kann dann in modellbasierten Ansichten wie der ListView usw. verwendet werden.

Ich habe ein Tutorial zu diesem Thema angehängt. Es beschreibt die Verwendung des QListModel.

http://doc.qt.io/qt-4.8/qdeclarativemodels.html

35
mmoment

Sie sollten in diesem Fall Connections verwenden (möglicherweise ist dies die einzige Möglichkeit, eine Verbindung herzustellen).

  1. Setzen Sie Ihr Objekt myObj in die QML-Datei von setContextProperty

    qmlVectorForm->rootContext()->setContextProperty("YourObject", myOb);
    
  2. Dein Signal ist

    finishedGatheringDataForItem(QString signalString)
    
  3. Fügen Sie in der QML-Datei die folgenden Connectios-Likes hinzu:

    Connections {
        target: YourObject 
        onFinishedGatheringDataForItem: {
            qmlString = signalString
        }
    }
    
35
Ken