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

Posted

技术标签:

【中文标题】如何从 C++ 端连接到 QML 项目的 onClick 事件【英文标题】:How to hook up to the onClick event of a QML item from C++ side 【发布时间】:2018-10-19 16:21:04 【问题描述】:

场景: 我有一个在 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")
    

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

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 信号信号。我该怎么做?

【问题讨论】:

【参考方案1】:

在一般情况下,用于交互的方法可能很危险,因为项目的生命周期取决于 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";

【讨论】:

是的。这是我需要做的特殊情况。确认它完全在此逻辑所依赖的 QML 项的存在范围内。

以上是关于如何从 C++ 端连接到 QML 项目的 onClick 事件的主要内容,如果未能解决你的问题,请参考以下文章

从 ios 和 android 端连接到 xmpp 时获取所有组消息

当后端连接到 wordpress 时如何向设备发送通知?

C++ 和 QML:将 QML 信号连接到 C++ 插槽

从后端连接到外部数据库

无法将 Qml 信号连接到 C++ 插槽

如何从 QML 访问嵌套的 QStandardItemModel 的项目?