【问题标题】:Passing parameters from C++ to QML将参数从 C++ 传递到 QML
【发布时间】:2017-08-16 14:45:51
【问题描述】:

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

有点像这样:

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

在 QML 中,每次发出 mySignal(i, j) 时,我都想调用 QML 函数并使用 ij 进行处理。

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

我该怎么做呢?

【问题讨论】:

标签: qt qml qtquick2 qt-signals


【解决方案1】:

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

void yourSignal(int i, QString t)

你有两个选择:

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

    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
        }
    }
}
  • 将您的类添加为 qml 变量。当您需要多次重复使用您的对象时,此选项是首选。 reference:

    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
        }
    }
}

【讨论】:

  • 我添加了一些 QML 代码。我认为这个答案正是唐乔所要求的,使用两种可能的场景。
  • 现在你做对了,我想。来自我的+1,特别是因为我认为 OP 不太可能再次出现接受它。我在您的代码中添加了两个 cmets 并进行了更多解释,希望您能接受。
【解决方案2】:

您可以在此处找到整个文档:

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

【讨论】:

  • 由于链接可能失效(特别是当您指向旧的 Qt4.8 文档时),如果您可以扩展您的答案以包含所有相关详细信息以回答,我们将不胜感激这个问题。该链接应仅被视为附加
猜你喜欢
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 2017-08-28
  • 2012-11-05
相关资源
最近更新 更多