有选择地将 C++ 核心逻辑暴露给 QML 的最佳方法

2023-12-27

我想设置特定 QML 组件的上下文属性,而不是在根上下文中。我不希望在组件外部访问该属性。 C++ 有没有一种方法可以访问组件的上下文,只允许从组件的上下文中访问命名属性,而不是从全局命名空间中访问?我想保持 QML 声明性,而不是在 C++ 中创建组件来访问它的上下文。

//main.qml
Item {
    Button {
        // this should NOT work
        text: ctxProp.text
     }
     OtherQml {
     }
}

//OtherQml.qml
Item {
    Button {
        // this should work
        text: ctxProp.text
    }
}

//main.cpp
QGuiApplication app(art, argv);
QQmlQpplicationEngine engine;

// Some QObject Type
CtxProp ctxProp;
// I'd like to set the context such that only OtherQml.qml can access
// this context propery. Setting in root context property makes it global
engine.rootContext()->setContextProperty("ctxProp", &ctxProp);

您应该实现一个仅在导入时可见的单例。这是向 QML 公开核心逻辑的最佳且最有效的解决方案,因为不涉及树查找,并且仅在您选择导入它的位置可见。

qmlRegisterSingletonType<CtxProp>("Sys", 1, 0, "Core", getCoreFoo);
// and in QML
import Sys 1.0
...
doStuffWith(Core.text)

getCoreFoo是返回一个函数的名称CtxProp *值(任何QObject *由于元数据的使用,实际上会这样做)。您可以在函数中创建它,或者只是返回指向现有实例的指针。有些人声称,如果该函数不创建它,可能会出现问题,因为它可能是由 QML 引擎管理的,但是我一直在使用一个预先存在的函数,我在多个 QML 引擎之间共享该函数,并且还没有问题在于,当然明确地将所有权设置为 C++,因为 QML不能真正被信任 https://stackoverflow.com/questions/33792876/qml-garbage-collection-deletes-objects-still-in-use在更动态的使用上下文中管理对象的生命周期。

// main.cpp

static Core * c;
static QObject * getCore(QQmlEngine *, QJSEngine *) { return c; }

int main(int argc, char *argv[]) {
  QGuiApplication app(argc, argv);
  QQmlApplicationEngine engine; 
  c = new Core; // create
  engine.setObjectOwnership(c, QQmlEngine::CppOwnership); // don't manage
  qmlRegisterSingletonType<Core>("Sys", 1, 0, "Core", getCore); // reg singleton
  engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); // load main qml
  return app.exec();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有选择地将 C++ 核心逻辑暴露给 QML 的最佳方法 的相关文章

  • 对齐坐标系

    Let s say I have 2 coordinate systems as it is shown in image attached 如何对齐这个坐标系 我知道我需要将第二个坐标系围绕 X 平移 180 度 然后将其平移到第一个坐标
  • [本机]:在Qt for Android中使用Java函数和第3方库[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 最近我用qt写了一个android应用程序 但我有一个很大的问题 我可以使用 调用一些原生的android API 比如调用特殊的activit
  • Qt 计算和比较密码哈希

    目前正在 Qt 中为测验程序构建面向 Web 的身份验证服务 据我了解 在数据库中存储用户密码时 必须对其进行隐藏 以防落入坏人之手 流行的方法似乎是添加的过程Salt https en wikipedia org wiki Salt cr
  • 如何将图标放置到 QLineEdit 上?

    stackoverflow com 网站的右上角有一个带有放大镜头的搜索字段和一个灰色的 搜索 关键字 我想知道是否有可能实现相同的外观QLineEdit 如果是这样那怎么办 QLineEdit lineEdit new QLineEdit
  • 从 QML 实例化 C++ 对象会产生巨大的内存使用开销

    实例化一个QObjectC 堆中的派生类为每个对象提供了大约 160 个字节 通过注册相同的对象qmlRegisterType 用于从 QML 创建并通过以下方式动态创建对象createObject 每个对象给我 2000 多个字节 这是完
  • QGraphicsView 和 eventFilter

    这个问题已经困扰我两天多了 所以我想我应该问一下 我在Win7上使用Qt 4 5 3 用VC2008编译 我有 MyGraphicsView 继承 QGraphicsView 和 MyFilter 继承 QObject 类 当我将 MyFi
  • 如何在按下托盘图标菜单操作时执行功能?

    int main int argc char argv QApplication oApp argc argv QAction action1 QMenu menu QSystemTrayIcon TrayIcon QIcon favico
  • 如何创建QWidget的屏幕截图?

    我在 Qt Creator 中做作业 在其中绘制 QWidget 并且需要保存此 QWdiget 的某些部分 我试图解决这个问题 QPixmap pixmap pixmap copy rectangle rectangle is part
  • (如何)我可以抑制未找到包配置文件的警告吗?

    我正在尝试创建一个CMakeLists txt尝试查找的文件Qt5 如果失败 则尝试回退到Qt4安装 该脚本到目前为止有效 但如果出现以下情况我总会收到警告Qt5未安装 注意FindQt5 cmake是由提供Qt5并且仅当以下情况时才可用Q
  • Qt mouseReleaseEvent() 未触发?

    我有一个显示图片的库 我们称之为 PictureGLWidget 其中 class PictureGLWidget public QGLWidget 所以 PictureGLWidget 扩展了 QGLWidget 在PictureGlWi
  • QTextEdit.find() 在 Python 中不起作用

    演示问题的简单代码 usr bin env python import sys from PyQt4 QtCore import QObject SIGNAL from PyQt4 QtGui import QApplication QTe
  • 如何在模型更改时停止ListView“跳跃”

    我需要做什么 我需要创建一个聊天窗口用一个ListView在 QML 中存储聊天消息 我设置listView positionViewAtEnd 以便跟踪最后的消息 我禁用positionViewAtEnd当我向上滚动时 我可以阅读过去的消
  • PyQt:如何设置组合框项目可检查?

    为了将 GUI 小部件数量保持在最低限度 我需要找到一种方法来为用户提供下拉菜单项的选择 这些菜单项可用于过滤掉 listWidget 项中显示的内容 假设 listWidget 列出了 5 个不同类别的项目 Cat A Cat B Cat
  • 如何在带有预编译头的项目中使用google protobuf

    我有一个包含多个项目的解决方案 我的项目 但不是全部 使用预编译头 我决定使用 protobuf 但遇到了一个问题 在 protoc exe 从 proto 生成 pb h 后 我尝试包含标头并收到错误 预编译标头未包含在 pb h 中 我
  • 错误 LNK2001:无法解析的外部符号 __CxxFrameHandler3

    我正在将 Qt 从 VS 2013 迁移到 Qt 5 10 1 到 VS 2015 出现以下多个链接错误 error LNK2001 unresolved external symbol CxxFrameHandler3 error LNK
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • 即使在可访问性中勾选应用程序,AXIsProcessTrustedWithOptions 也不会返回 true

    As this question https stackoverflow com questions 17693408 enable access for assistive devices programmatically on 10 9
  • Qt:测量事件处理时间

    我想测量我的应用程序中的哪些事件在主线程中需要很长时间才能执行 阻塞 GUI 或者至少是否有任何事件花费的时间超过 比如说 10 毫秒 显然 我对需要很长时间的任务使用线程和并发 但有时很难在其他线程中放入的内容和可以保留在 GUI 中的内
  • QTimer 一点也不准确?

    运行在 Windows7 64 位机器上 具有非常强大的 CPU 8 核 16 线程 我使用 QTimer 以 50Hz 触发函数调用 但我最终得到了 30Hz 函数调用本身肯定需要不到 10 毫秒才能完成 整个过程发生在一个单独的线程中
  • 在 MacOS 终端上运行 ffmpeg [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我对 MacOS 相当陌生 我发现使用终端来获取信息并不容易ffmpeg和我在 Window 上一样正常运行 我有 ffmpeg 二进制文件ffmpe

随机推荐

  • Ada - 提出可访问性检查

    我从Github下载了这个程序 https github com raph amiard ada synth lib https github com raph amiard ada synth lib 我尝试了第一个例子 但遇到了一个例外
  • Maven 父 POM 与 BOM 依赖管理

    假设我有一个 Maven 父 POMroot它定义了foo bar 1 0 0在依赖管理中 我有另一个父 POMparent它使用root作为父级 只是为了向示例添加另一个层 最后我有一份材料清单bom它使用root作为其父级但重新定义fo
  • 如何使“Enter”键的行为类似于 JFrame 上的“提交”

    我正在构建一个客户端 服务器应用程序 我想让用户在身份验证框架上变得轻松 I want to know how to make enter key submits the login and password to the Database
  • 您需要使用不同的包名称,因为“com.example”受到限制

    我已经在这里找到了很多关于这个问题的线程 但没有一个对我有用 我使用的是Android Studio 2 1 2 并且我仍然有com example域名 在清单或任何其他文件中更改它会导致出现大量错误 而我的 build gradle 仅显
  • SwiftUI:两指滑动(滚动)手势

    我对 2 指滑动 滚动 手势感兴趣 不是两指拖动 而是两指滑动 无需按下 就像在 Safari 中用来向上和向下滚动一样 据我所知 没有一个基本手势可以用于此目的 TapGesture 不是 LongPressGesture 不 DragG
  • 防止多次登录

    我试图在我的应用程序中阻止同一用户的多次登录 我的想法是在用户登录时更新安全标记并将其添加为声明 然后在每个请求中将 cookie 中的标记与数据库中的标记进行比较 这就是我的实现方式 public virtual async Task
  • 滚动条没有出现?

    我正在为 Tumblr 开发主题 但由于某种原因滚动条没有出现 这是博客的网址 http infinitethemedewitt tumblr com 主题的代码可以通过右键单击在页面源代码中找到 除了 html 之外的所有代码 因为它被
  • fopen 不显示内容

    不知道为什么我的即时通讯页面出现空白 txt 中有数据 php 中没有错误 这是 txt Product txt ID OID Title Description Option Price 01 01JAP Japanese Mod
  • CarrierWave + RMagick 方形裁剪?

    我正在尝试使用 Ruby on Rails CarrierWave 和 RMagick 制作固定的方形图像裁剪 我尝试过以下两种方法 但没有运气 version thumb do process resize to fit gt 200 2
  • C# 十进制格式化查询

    我正在尝试格式化小数 以便它显示如下 14 5 应显示为 14 50 14 50 应显示为 14 50 14 05 应显示为 14 05 14 00 应显示为 14 是否可以使用单一字符串格式 即不使用条件格式 我尝试过 0 不满足第一个示
  • 水平滚动列表

    我希望将图像显示在水平列表中 这就是我到目前为止所做的 var list Ext create Ext List store store itemTpl new Ext XTemplate img src icon inline true
  • 设置解析注册的默认个人资料图片

    我试图在注册时在解析中设置默认的个人资料图片 该图片位于我的项目文件夹中 有什么办法可以设置不上传照片吗 var user new Parse User user set username username val user set pas
  • 在 HyperLedger Composer 查询中获取资产计数?

    我想在 HyperLedger Composer 中编写一个查询 返回我在超级账本中拥有的资产数量 我有数千条记录 我不想将它们全部获取并计算计数 数据传输会很慢 我希望查询返回计数 不幸的是 这儿没有count使用作曲家查询语言 您必须创
  • cocos2d 计算给定起点、角度和距离的目的地点

    我想快点吧 Cocos2d 和 xcode 中的 2d 问题 I have CGPoint currPoint float lineLength float angle 现在 我需要找到距离 currPoint 角度为 lineLength
  • 大量数据的数据库设计[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在开展一个项目 涉及来自美味网站的大量数据 可用数据为 日期 用户 ID 网址 标签 针对每个书签 我将数据库规范化为 3NF 并且由于我们
  • 是否需要“设置字符集utf8”?

    我正在重写我们的数据库类 基于 PDO 并陷入困境 我被教导要同时使用SET NAMES utf8 and SET CHARACTER SET utf8在 PHP 和 MySQL 中使用 UTF 8 时 在 PDO 中我现在想使用PDO M
  • PHP 日期比较

    如何检查 2008 02 16 12 59 57 格式的日期是否小于 24 小时前 if strtotime 2008 02 16 12 59 57 gt time 24 60 60 LESS
  • 如何确定 _POSIX_PATH_MAX 的系统值

    谁能告诉我如何找到系统值 POSIX PATH MAX在 Linux 薄荷中 我知道它在 文件中可用 但我不知道如何找到它的值 根据 POSIX 要使用的工具被命名为getconf http pubs opengroup org onlin
  • React Router Lazy 组件不起作用

    所以这有效 import Page from components Page render return
  • 有选择地将 C++ 核心逻辑暴露给 QML 的最佳方法

    我想设置特定 QML 组件的上下文属性 而不是在根上下文中 我不希望在组件外部访问该属性 C 有没有一种方法可以访问组件的上下文 只允许从组件的上下文中访问命名属性 而不是从全局命名空间中访问 我想保持 QML 声明性 而不是在 C 中创建