c++ - 如何从 C++ 端连接到 QML 项目的 onClick 事件

标签 c++ qt qml qquickitem

场景:
我有一个在 Qt 5.9.4 商业版上运行的 Qt 应用程序。它是一个基于 QtQuickQML 的应用程序,在 iOSAndroid 上运行。

我在 UI 上有一个 QML 项目,如下所示:

SomeItem {
    text: qsTr("Some Item")
    objectName: "someitem"
    visible: false
    onClicked: {
        console.log("Some item was clicked")
    }
}

我有一个 C++ 函数可以轻松控制 SomeItem 的属性。

void MyCppClass::Func() {

    QQuickItem *someItem = qml_engine->rootObjects()[0]->findChild<QQuickItem*>("someitem");
    someItem->setVisible(true); // this works

    // How to listen to someItem's onClick event here
}

问题:
我想在 C++ 方法或 lambda 中监听 someItem 的 onClick 事件,而不更改 QML 中的任何内容。基本上从 C++ 端本身连接到 someItem 的 onClick 信号。我该怎么做?

最佳答案

用于交互的方法在一般情况下可能很危险,因为项目的生命周期取决于 QML,因此请确保不会发生这种情况。根据您的要求,我假设 MyCppClass 继承自 QObject 或子类,您必须创建一个插槽并使用旧的连接语法:

*.h

class MyCppClass: public QObject
{
...
private slots:
    void on_clicked();
...
};

*.cpp

void MyCppClass::Func() {

    QQuickItem *someItem = qml_engine->rootObjects()[0]->findChild<QQuickItem*>("someitem");
    if(!someItem)
        return;
    someItem->setVisible(true); // this works
    connect(someItem, SIGNAL(clicked()), this, SLOT(on_clicked()));

}

void MyCppClass::on_clicked(){
    qDebug()<<"on clicked";
}

关于c++ - 如何从 C++ 端连接到 QML 项目的 onClick 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52896361/

相关文章:

qt - 这些时区转换正确吗?

qml - anchor 属性

c++ - 当底层模型更改时,QT QmlMap PolyLine 未正确更新

c++ - Inline 是否将函数/方法限制在其当前源文件的范围内?

c++ - 如何在 QtWebengine 中加载 Chrome 扩展

c++ - ITK-VTK vtkResliceImageViewer 未定义

python - 使用 PyQt 动态将项目设置为 QML ListModel

c++ - 为什么这个虚拟析构函数在 C++ 中不起作用?

c++ - 类指针失去成员?

c++ - 为什么 WinInet 在通过 FQDN 连接时无法通过协商自动验证,但通过 IP 连接时会成功?