2017-08-16 5 views
0

Ich möchte einige Parameter von C++ zu QML übergeben, damit QML etwas mit ihnen tun kann.Übergabe von Parametern von C++ zu QML

Etwas wie folgt aus:

void MyClass::myCplusplusFunction(int i, int j) 
{ 
    emit mySignal(i, j); 
} 

In QML, jedes Mal, wenn mySignal(i, j) emittiert wird, möchte ich eine QML-Funktion aufrufen und Sachen zu tun mit i und j.

Connections { 
    target: myClass 
    // mySignal(i, j) is emitted, call myQmlFunction(i,j) 
} 

Wie würde ich das machen?

+0

https://stackoverflow.com/questions/8834147/c-signal-to-qml-slot-in-qt –

+2

Mögliches Duplikat von [C++ SIGNAL zu QML SLOT in Qt] (https://stackoverflow.com/questions/8834147/c-signal-to-qml-slot-in-qt) – eyllanesc

+0

@ eyllanesc: Dies ist keinesfalls ein Duplikat der verknüpften Frage. Es ist nur verwandt. In der Frage, die Sie verknüpft haben, versucht das OP, die Verbindung auf der C++ - Seite herzustellen. Diese Frage betrifft die Verbindung auf der QML-Seite. – derM

Antwort

1

Angenommen, Sie haben ein Signal in cav Seite haben:

void yourSignal(int i, QString t) 

Sie haben zwei Möglichkeiten:

  • Registrieren Sie Ihre Klasse als qml-Typ und verwenden Sie sie als qml-Objekt. Das Objekt wird von der QML-Seite initialisiert. reference:

    qmlRegisterType<ClassNameCPP>("com.mycompany.qmlName", 1, 0, "ClassNameQml");

Dann in qml:

import QtQuick 2.9 
import com.mycompany.qmlName 1.0 

Item{ 
    ClassNameQml{ 
     id: myQmlClass 
     onYourSignal: { 
      console.log(i,t); // Do whatever in qml side 
     } 
    } 
} 
  • Ihre Klasse als qml Variable hinzufügen. Diese Option wird bevorzugt, wenn Sie Ihr Objekt mehrmals wiederverwenden müssen. reference:

    view.rootContext()->setContextProperty("varName", &cppObject);

Dann in qml:

import QtQuick 2.9 
Item{ 
    Connections{ 
     target: varName 
     // In QML for each signal you have a handler in the form "onSignalName" 
     onYourSignal:{ 
      // the arguments passed are implicitly available, named as defined in the signal 
      // If you don't know the names, you can access them with "arguments[index]" 
      console.log(i,t); // Do whatever in qml side 
     } 
    } 
} 
+0

Ich habe etwas QML-Code hinzugefügt. Ich denke, diese Antwort ist genau das, was Don Joe verlangt, indem er die zwei möglichen Szenerien benutzt. – albertTaberner

+0

Jetzt hast du es richtig gemacht, denke ich. +1 von mir, zumal ich denke, dass es unwahrscheinlich ist, dass das OP wieder auftaucht, um es zu akzeptieren. Ich habe zwei Kommentare in Ihrem Code hinzugefügt, mit weiteren Erläuterungen. Ich hoffe, dass Sie damit einverstanden sind. – derM

0

Sie können die gesamte Dokumentation finden Sie hier:

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

+0

Danke Mann, schätze es –

+1

Da der Link möglicherweise tot geht (besonders wenn Sie auf die alte Qt4.8 Dokumentation verweisen), wäre es sehr zu begrüßen, wenn Sie Ihre Antwort so erweitern könnten, dass sie alle relevanten Details enthält Frage. Der Link sollte nur als * zusätzlich * betrachtet werden. – derM

Verwandte Themen