我有多个通过 StackView 推送的 qml 文件。如何将它们连接到 C++

2024-01-05

我的项目包含 6 个 qml 文件: main.qml 打开一个新的 ApplicationWindow 并声明工具栏。它还使用 initalItem homescreen.qml 初始化 StackView。在主屏幕上,我有不同的按钮,可以通过 stack.push("URL") 打开不同的 qml 文件。除了 main.qml 之外,所有文件都以 Item{} 开头。 我已经能够连接来自 main.qml 和 home.qml 的信号。但我无法访问堆栈更深的对象。我不知道是否应该更改 .cpp 代码来访问其他对象,或者是否应该更改 StackView 的初始化,以便在开始时加载并访问所有文件。 这是代码,分为最基本的部分:

  • main.qml

    ApplicationWindow {
          Rectangle{
                    id: homeButton
                    objectName: "homeButton"
                    signal qmlSignal(string msg)
                    MouseArea {
                         onClicked:  {stack.push({item:"qrc:/home.qml}); homeButton.qmlSignal("Hello")}
                    }
          }
          StackView{
               initalItem: "qrc:/home.qml"
          }
    

    }

  • 第二个frame.qml // 主屏幕之后出现的随机qml 文件

    Item {
          Rectangle{
                    id: test
                    objectName: "test"
                    signal qmlSignal(string msg)
                    MouseArea {
                         onClicked:  {stack.push({item:"qrc:/thirdframe.qml}); test.qmlSignal("Hello")}
                    }
          }
    }
    
  • main.cpp

    QApplication app (argc, argv);
    QQmlEngine enigne;
    QQmlComponent component(&engine, QUrl(QStringLiteral("qrl:/main.qml")));
    QObject *object = componet.create();
    QQmlComponent newcomponent(&engine, QUrl(QStringLiteral("qrl:/secondframe.qml")));
    QObject *newobject = newcomponet.create();
    
    MyClass myClass
    QObject *home = object->findChild<QObject*>("homeButton");    // I'm able to connect to every Object in the main.qml or home.qml
    QObject::connect(home,SIGNAL(qmlSignal(Qstring)), &myClass, SLOT(cppSlot(QString)));
    QObject *test = newobject->findChild<QObject*>("test");       // Can't connect to the Objects in secondframe.qml
    QObject::connect(test,SIGNAL(qmlSignal(Qstring)), &myClass, SLOT(cppSlot(QString)));
    

比进入 QML 树并提取可能存在或不存在的对象更好的方法是向 QML 提供基于 C++ 的 API。

  1. 创建一个基于 QObject 的类,该类具有 QML 需要能够作为槽调用的方法或Q_INVOKABLE

    class MyAPI : public QObject
    {
        Q_OBJECT
    public slots:
        void cppSlot(const QString &text);
    };
    
  2. 创建它的实例并将其公开给 QML

    MyAPI myApi;
    QQmlEngine engine;
    engine.rootContext()->setContextProperty("_cppApi", &myApi);
    
  3. 在 QML 中使用,就好像“_cppApi”是一个对象 ID

    MouseArea {
         onClicked:  {stack.push({item:"qrc:/thirdframe.qml}); _cppApi.cppSlot("Hello")}
    }
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我有多个通过 StackView 推送的 qml 文件。如何将它们连接到 C++ 的相关文章

随机推荐

  • 在 Rails 6 中测试 jquery

    我对编程和测试相当陌生 看看 jquery 是否适用于我的 Rails 6 设置 为了做到这一点 我有 创建了一个新的 Rails 应用程序 生成了一个脚手架 将以下代码插入到新创建的脚手架的index html erb视图中 div st
  • 如何使用 Mojolicious 上传多个文件?

    我是 Mojolicious 的新手 正在尝试学习它 我正在尝试使用表单上传多个文件 但一次仅上传一个文件 有什么建议吗 perl w use Mojolicious Lite use Mojo Upload use v5 14 get g
  • 如何显示使用“withdraw”方法隐藏的窗口?

    我想在打电话后显示一个窗口withdraw 以下是我当前的代码 from Tkinter import def callback global root root withdraw win2 Tk root Tk Label root te
  • 在画布中绘制矩形区域的弹出工具提示

    我有一个在 HTML5 中使用 JavaScript 填充的矩形区域 并且我需要添加一个工具提示弹出窗口 以便当用户在手持设备上触摸 单击它或在浏览器中将鼠标悬停在它上面时显示文本 我已经查看了 StackOverflow 上已有的示例 但
  • Spring Boot 4 不渲染 JSP 抛出 404

    我有以下项目结构 src main java com test Application java controllers MyController java webapp WEB INF jsp main jsp 我想做类似的事情this
  • JDBC Spring 中的错误 Sql 语法异常

    我是得到 org springframework jdbc BadSqlGrammarException 准备语句回调 错误的 SQL 语法 select cid 来自临床医生的临床医生代码 密码 名字 姓氏 临床医生代码 嵌套异常是 co
  • 如何使用 CloudFormation 为特定 Lambda 设置 Lambda 警报?

    这是CloudFormation的结构Alarm from AWS文档 https docs aws amazon com AWSCloudFormation latest UserGuide aws properties cw alarm
  • 如何使用 Google Guava 中的 Throwables.propagateIfInstanceOf()?

    javadoc 示例 http guava libraries googlecode com svn tags release08 javadoc com google common base Throwables html propaga
  • 如何成为一名优秀的Python程序员? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • macOS:向 Cocoa 绑定公开 Swift 属性的正确方法

    我正在 Mac 上开发一个现有的 Swift Objective C 项目 并在代码中创建一些 UI 我根据我管理的 NSTableView 中的选择启用一个按钮without使用 NSArrayController 出于原因 我有一处房产
  • 为什么 as.data.frame 忽略 col.names = vector

    我顽固地尝试在一行中创建一个具有命名行和列的数据框 我意识到我可以通过使用 colnames forecast 轻松地做到这一点 但想简化一下 如果只是为了证明我可以做到这一点 以下不起作用 没有错误 但未设置列名 forecast lt
  • 如何在 iPad 中调整网页大小/重新缩放

    我有一个网站 其移动版本使用 jquery mobile 当我将其从纵向更改为横向时 它会正确放大 但当我翻转到纵向时 它会保持相同的缩放级别 并且比视图更宽 这会破坏用户体验 我使用常规 从我所做的所有搜索来看 这应该可以 不幸的是它不适
  • 处理“超规范化”数据

    我的雇主是一家小型办公用品公司 正在更换供应商 我正在浏览他们的电子内容 以得出一个强大的数据库模式 我们之前的模式几乎是在没有任何思考的情况下拼凑在一起的 这几乎导致了一个令人难以忍受的数据模型 其中包含损坏的 不一致的信息 新供应商的数
  • Laravel 控制器/模型/视图的命名约定是什么?

    我记得听说你应该以特殊的方式命名你的控制器 模型和视图 可以是单数 也可以是复数 我不记得要命名哪些内容 而且我在文档中找不到任何有关它的信息 我猜是这样的 控制器是复数 视图是复数的 模型是单一的 我走在正确的轨道上吗 我知道这只是一个惯
  • 移动时切比雪夫距离 x 坐标错误

    所以我正在复制移相器切比雪夫距离示例 并在解决方案之后here https stackoverflow com questions 75478712 this gamestate variable not recognized phaser
  • 如何在 Django REST Framework 的单元测试期间登录用户?

    这是我的 DRF 视图 api view GET permission classes IsAuthenticated def check user request user request user use user object her
  • mysql中三个表之间的内连接

    我有 3 个表叫做 公司 联系方式 活动 联系人具有公司的外键 公司拥有活动的外键 它们都有一个 名称 列 我需要一个连接表 其中包含联系人姓名 公司名称和活动名称 contact id name company id companies
  • 根据 Woocommerce 中选择的运输方式显示隐藏付款方式

    当我在灵活的运输插件表单 wpdesk 中选择指定的 运输方式 时 我想隐藏某些付款方式并启用另一种付款方式 我已经尝试过该代码 add filter woocommerce available payment gateways gatew
  • Sine CAShapeLayer 作为 CALayer 的掩模

    我正在尝试实现下一个奇怪的事情 我有一些点 我想将它们与正弦波联系起来 Next 方法返回用于绘制绘图的点数组 NSArray plotPointsBetweenPoint CGPoint pointA andPoint CGPoint p
  • 我有多个通过 StackView 推送的 qml 文件。如何将它们连接到 C++

    我的项目包含 6 个 qml 文件 main qml 打开一个新的 ApplicationWindow 并声明工具栏 它还使用 initalItem homescreen qml 初始化 StackView 在主屏幕上 我有不同的按钮 可以