如何从 QML 监听 C++ 信号?

2023-12-05

我有一个我称之为 C++“服务”的东西,我想将其接口公开给 QML。我正在尝试使用QQmlContext's setContextProperty将对象链接到 QML 并从QML Connections block.

QML 不会像之前我没有在 QML 上下文中注册服务时那样抱怨引用错误:

qrc:/main.qml:13: ReferenceError: service is not defined

所以,QML 似乎找到了service现在对象,但是 QML 插槽 javascript 函数没有被调用。我在 Qt Creator 中看到了这一点:

Debugging starts
QML debugging is enabled. Only use this in a safe environment.
QML Debugger: Waiting for connection on port 62301...
Calling the clbk signal
Debugging has finished

应该有一个In onClbk每条消息console.log("In onClbk");我知道我可以使用QMetaObject::invokeMethod直接调用 QML 对象的函数,但我试图通过使用信号和槽来实现更宽松的耦合。

我想避免创建QQuickItem如果可能的话,在 QML 中实例化服务。

不幸的是,样板代码很多,这是我的SSCCE.

这是通过 Qt Creator 5.4 创建的所有项目目录的 zip 文件。

main.cpp

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;
    auto rc = engine.rootContext();
    auto service = new Service();
    engine.rootContext()->setContextProperty(QStringLiteral("service"), service);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    // invoke the trigger arbitrarily
    QTimer *timer = new QTimer();
    timer->setSingleShot(true);
    QObject::connect(timer, SIGNAL(timeout()), service, SLOT(trigger_clbk()));
    timer->start(4000);
    return app.exec();
}

服务.h

class Service : public QQuickItem {
    Q_OBJECT

public:
    virtual ~Service(){}
signals:
    void clbk();
public slots:
    void trigger_clbk() {
        qDebug()<<"Calling the clbk signal";
        clbk();
    }
};

main.qml

import QtQuick 2.4
import QtQuick.Window 2.2

Window {
    visible: true
    MainForm {
        anchors.fill: parent
        mouseArea.onClicked: {
            Qt.quit();
        }
        // subscribe to a signal
        Connections {
            target: service
            onClbk: function(){
                console.log("In onClbk");
            }
        }
    }
}

Main.ui.qml

import QtQuick 2.3

Rectangle {
    property alias mouseArea: mouseArea

    width: 360
    height: 360

    MouseArea {
        id: mouseArea
        anchors.fill: parent
    }

    Text {
        anchors.centerIn: parent
        text: "Hello World"
    }
}

您正在尝试将 JS 函数分配给cblk信号处理程序,它不会像信号处理程序一样工作is处理信号的函数。所以Connections块应为:

Connections {
    target: service
    onClbk: {
        console.log("In onClbk");
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 QML 监听 C++ 信号? 的相关文章

随机推荐

  • 在 OoOE 处理器中,内存存储真的可以重新排序吗?

    我们知道两条指令可以通过面向对象处理器 例如 有两个全局变量在不同线程之间共享 int data bool ready 作家线程产生data并打开一个标志ready允许读者使用该数据 data 6 ready true 现在 在 OoOE
  • 增加使用数字和字符(也称为 Base36 数字)的索引

    我有一个基于字符串的代码 长度可以是两个或三个字符 我正在寻找一些帮助来创建一个可以增加它的函数 代码的每个 数字 的值为 0 到 9 和 A 到 Z 一些例子 序列中的第一个代码是 000 009 下一个代码是 00A00D 下一个代码是
  • C/C++ 宏而不是 const [重复]

    这个问题在这里已经有答案了 宏观 define MAX 80相当于const int MAX 80 两者都是恒定的 不能修改 使用宏而不是常量不是更好吗 常量整数占用内存 宏的名称被预处理器替换为其值 对吗 所以不需要内存 为什么我要使用
  • 修复有问题的 unicode 字符串

    有错误的 unicode 字符串是指其中意外编码了字节的字符串 例如 Text Windows 1255 编码 x99 x8c x85 x8d 统一码 u u05e9 u05dc u05d5 u05dd 有问题的 Unicode u x99
  • EDSDK 回调不起作用

    我有一个可用的命令行应用程序 使用 EDSDK v2 13 但是 当我注册回调时 会出现一系列属性事件 然后就什么也没有了 我已经纠正了这个循环 如下所示 while kbhit EdsOpenSession camera Sleep 10
  • 使用自定义 data-id 加载模态

    我的一个网站有问题 我有一些这样的列表链接 ul li a Room 10 a li li a Room 20 a li ul On my myModal 我希望表单出现编辑信息 所以我通过了data id 这是我数据库中的 id HTML
  • 在 PrimeFaces 的文件上传侦听器中验证上传图像的尺寸

    我正在使用上传图像
  • Cakephp 中的 WordPress

    我已经在 Cakephp 中安装了 WordPress app webroot blog 文件夹并将 WordPress 永久链接设置更改为月份和名称 例如 http abc com blog 2013 02 sample post 现在
  • 当文件确实存在时,C# System.IO.FileNotFoundException

    我正在尝试从 ASP NET Core 中的操作返回文件 public IActionResult GetFile string filePath return File home me file png application octet
  • Jqgrid。从键值中找到rowId

    我有一个基本的 jqgrid 实现 fsJqGrid jqGrid datatype local height 175 colNames FeatureId Name colModel name FeatureId index Featur
  • IIS7:缓存设置不起作用...为什么?

    我的 IIS7 web config 设置为以下内容 其中包含静态资产文件夹 不在 ASP NET 应用程序或任何其他内容中
  • ObServer 发出选择性 D-BUS 信号(单播信号)

    我遇到的情况是 我有一个 ObServer 对象和一组客户端 ObServer和客户端通过D BUS IPC 连接 ObServer 为所有客户端提供通用接口 但是 ObServer 有时需要通知客户端一些事件 客户端监听 ObServer
  • Android volley:如何处理错误响应

    我实现了一个带有 volley 库的 Android 应用程序来连接我的数据库 与 get 和 post 请求的连接有效 但服务器响应不起作用 发生这种情况是因为错误响应会自动捕获错误 例如 我的服务器响应代码为 201 表示登录成功 但齐
  • Camel 2.11批量聚合如何与单独的路由一起工作?

    首先有一个类似的未回答的问题将路由加入单个聚合器 我们有一些消费者路由 ftp file smb 从远程系统读取文件 简化了直接路由的测试 但与批量消费者的行为类似 from direct routeId id routeId setPro
  • Rails +omniauth + facebook - 检测到 csrf

    我正在努力通过现有的方式登录网站facebook帐户 所以我注册了一个facebook应用程序并存储api and secret in development rb and production rb文件 然后我用了omniauth fac
  • 如何仅打印python列表中的重复元素[重复]

    这个问题在这里已经有答案了 有没有内置的方法来打印 python 列表中存在的重复元素 我可以为此编写程序 我正在寻找的是是否有任何内置方法或相同的东西 For Ex 用于输入 4 3 2 4 5 6 4 7 6 8 我需要操作4 6 有的
  • 从 MySQL 迁移到 NoSQL 的示例? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 对于类似 Facebook 的网站 即 它是写入密集型并提供用户自定义页面 我想构建一个原型来研究以文档为中心的 NoSQL 架构是否是分片的良好替代方案 并减少单个主服务器 多个从
  • 在 numpy 数组内生成填充多边形

    我正在寻找一种基于一组多边形顶点将填充多边形 绘制 到 numpy 数组中的方法 我宁愿使用尽可能少的外部库 例如 我有一个 20x20 numpy 数组 我希望由点 3 12 8 18 13 14 11 6 和 4 6 界定的区域为填充
  • 错误:allowDefinition='MachineToApplication' 超出应用程序级别

    关于这个主题有大量的 SO 帖子 到目前为止 解决方案似乎是将 IIS 中的目录配置为应用程序 另一个常见的解决方案是从根文件夹中删除备份的 web config 文件 我的问题有所不同 因为我在 IIS Express 上运行 因此无法将
  • 如何从 QML 监听 C++ 信号?

    我有一个我称之为 C 服务 的东西 我想将其接口公开给 QML 我正在尝试使用QQmlContext s setContextProperty将对象链接到 QML 并从QML Connections block QML 不会像之前我没有在