将参数从 C++ 传递到 QML

Don*_*Joe 5 qt qml qt-signals qtquick2

我想将一些参数从 C++ 传递到 QML,以便 QML 可以用它们做一些事情。

有点像这样:

void MyClass::myCplusplusFunction(int i, int j)
{
    emit mySignal(i, j);
}
Run Code Online (Sandbox Code Playgroud)

在 QML 中,每次mySignal(i, j)发出时,我都想调用 QML 函数并使用i和执行操作j

Connections {
    target: myClass
    // mySignal(i, j) is emitted, call myQmlFunction(i,j)
}
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?

alb*_*ner 6

假设您在 cpp 端有一个信号:

void yourSignal(int i, QString t)
Run Code Online (Sandbox Code Playgroud)

您有两个选择:

  • 将您的类注册为 qml 类型并将其用作 qml 对象。该对象将从 QML 端初始化。参考

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

然后,在 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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 将您的类添加为 qml 变量。当您需要多次重复使用对象时,首选此选项。参考

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

然后,在 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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)