Qt/Qml 和方法重载

2024-02-11

刚刚在 Qml 中调用重载的 C++ 方法时遇到了 Qt 框架的奇怪行为,并试图了解其背后的原因。假设我有一个QList<QVariant>具有以下方法的类似类:

...
Q_SLOT void append(const QVariant &item);
Q_SLOT void append(const QVariantList &items);
Q_SLOT void insert(int index, const QVariant &item);
Q_SLOT void insert(int index, const QVariantList &items);
...

Qml:

onclicked: {
  var itemCount = myListObject.size();
  myListObject.insert(itemCount, "Item " + (itemCount + 1));
}

Qt 以某种方式决定调用void insert(int index, const QVariantList &items)过载items参数设置为 anull QVariant 一个空的QVariantList而不是void insert(int index, const QVariant &item)过载QString包装成QVariant.

现在,如果我按如下方式更改声明的顺序,它将按预期工作:

Q_SLOT void insert(int index, const QVariantList &items);
Q_SLOT void insert(int index, const QVariant &item);

我在 Qt 框架的文档中找不到任何有关声明顺序及其如何影响调用期间解析方法的方式的内容。

有人可以解释一下吗?谢谢。


这个问题与 JavaScript 中的重载有关。一旦你了解了它——你就会明白其中的原因“奇怪的行为”你的代码。看看吧Javascript 中的函数重载 - 最佳实践 https://stackoverflow.com/questions/456177/function-overloading-in-javascript-best-practices.

简而言之——我建议你下一步:因为你可以操作QVariant双方的变量(QML 和 Qt/C++)——将变量作为参数传递,并根据需要在 Qt/C++ 端处理它。

你可以使用这样的东西:

你的 C++ 课程创建并传递给 QML(例如setContextProperty("TestObject", &tc)):

public slots:
    Q_SLOT void insert(const int index, const QVariant &something) {
        qDebug() << __FUNCTION__;
        if (something.canConvert<QString>()) {
            insertOne(index, something.toString());
        } else if (something.canConvert<QStringList>()) {
            insertMany(index, something.toStringList());
        }
    }

private slots:
    void insertOne(int index, const QString &item) {
        qDebug() << __FUNCTION__ << index << item;
    }

    void insertMany(int index, const QStringList &items) {
        qDebug() << __FUNCTION__ << index << items;
    }

在你的某个地方QML:

Button {
    anchors.centerIn: parent
    text: "click me"
    onClicked: {
        // Next line will call insertOne
        TestObject.insert(1, "Only one string")
        // Next line will call insertMany
        TestObject.insert(2, ["Lots", "of", "strings"])
        // Next line will call insertOne
        TestObject.insert(3, "Item " + (3 + 1))
        // Next line will call insertOne with empty string
        TestObject.insert(4, "")
        // Next line will will warn about error on QML side:
        // Error: Insufficient arguments
        TestObject.insert(5)
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt/Qml 和方法重载 的相关文章

  • Tensorflow 中的自定义资源

    由于某些原因 我需要为 Tensorflow 实现自定义资源 我试图从查找表实现中获得灵感 如果我理解得好的话 我需要实现3个TF操作 创建我的资源 资源的初始化 例如 在查找表的情况下填充哈希表 执行查找 查找 查询步骤 为了促进实施 我
  • 将处理后的图形绘制到另一个图形中

    我想将一个经过处理的图形绘制到另一个图形中 I have two graphics var gHead Graphics FromImage h var gBackground Graphics FromImage b Transform
  • 在 C++ 中分割大文件

    我正在尝试编写一个程序 该程序接受一个大文件 任何类型 并将其分成许多较小的 块 我想我已经有了基本的想法 但由于某种原因我无法创建超过 12 kb 的块大小 我知道谷歌等上有一些解决方案 但我更感兴趣的是了解这个限制的根源是什么 然后实际
  • 获取两个字符串之间的公共部分c# [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要的是获取两个单词之间的共同部分并获取差异 例子 场景1 word1 感言 word2 Test 将返回 公共部分Test 不同之
  • 捕获 foreach 条件中抛出的异常

    我有一个foreach在 foreach 本身的条件下循环期间中断的循环 有没有办法try catch抛出异常然后继续循环的项 这将运行几次 直到异常发生然后结束 try foreach b in bees exception is in
  • 通信对象 System.ServiceModel.Channels.ServiceChannel 不能用于通信

    通信对象System ServiceModel Channels ServiceChannel 无法用于通信 因为它处于故障状态 这个错误到底是什么意思 我该如何解决它 您收到此错误是因为您让服务器端发生 NET 异常 并且您没有捕获并处理
  • 在 C++11 中省略返回类型

    我最近发现自己在 C 11 模式下的 gcc 4 5 中使用了以下宏 define RETURN x gt decltype x return x 并编写这样的函数 template
  • 如何在 VS 中键入时显示方法的完整文档?

    标题非常具有描述性 是否有任何扩展可以让我看到我正在输入的方法的完整文档 我想查看文档 因为我可以在对象浏览器中看到它 其中包含参数的描述和所有内容 而不仅仅是一些 摘要 当然可以选择查看所有覆盖 它可能是智能感知的一部分 或者我不知道它并
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • 为什么 FTPWebRequest 或 WebRequest 通常不接受 /../ 路径?

    我正在尝试从 ftp Web 服务器自动执行一些上传 下载任务 当我通过客户端甚至通过 Firefox 连接到服务器时 为了访问我的目录 我必须指定如下路径 ftp ftpserver com AB00000 incoming files
  • 范围和临时初始化列表

    我试图将我认为是纯右值的内容传递到范围适配器闭包对象中 除非我将名称绑定到初始值设定项列表并使其成为左值 否则它不会编译 这里发生了什么 include
  • 通过不同 DLL 或 EXE 中的指针或引用访问 STL 对象时发生访问冲突

    我在使用旧版 VC6 时遇到以下问题 我只是无法切换到现代编译器 因为我正在处理遗留代码库 http support microsoft com kb 172396 http support microsoft com kb 172396
  • C# 编译器如何决定发出可重定向的程序集引用?

    NET Compact Framework 引入了可重定向程序集引用 现在用于支持可移植类库 基本上 编译器会发出以下 MSIL assembly extern retargetable mscorlib publickeytoken 7C
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • UWP 无法在两个应用程序之间创建本地主机连接

    我正在尝试在两个 UWP 应用程序之间设置 TCP 连接 当服务器和客户端在同一个应用程序中运行时 它可以正常工作 但是 当我将服务器部分移动到一个应用程序并将客户端部分移动到另一个应用程序时 ConnectAsync 会引发异常 服务器未
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • 为什么 Ajax.BeginForm 在 Chrome 中不起作用?

    我正在使用 c NET MVC2 并尝试创建一个 ajax 表单来调用删除数据库记录 RemoveRelation 的方法 删除记录的过程正在按预期进行 删除记录后 表单应调用一个 JavaScript 函数 从视觉效果中删除该记录 Rem
  • 以编程方式使用自定义元素创建网格

    我正在尝试以编程方式创建一个网格 并将自定义控件作为子项附加到网格中 作为 2x2 矩阵中的第 0 行第 0 列 为了让事情变得更棘手 我使用了 MVVM 设计模式 下面是一些代码可以帮助大家理解这个想法 应用程序 xaml cs base
  • 如何创建向后兼容 Windows 7 的缩放和尺寸更改每显示器 DPI 感知应用程序?

    我是 WPF 和 DPI 感知 API 的新手 正在编写一个在 Windows 7 8 1 和 10 中运行的应用程序 我使用具有不同每个显示器 DPI 设置的多个显示器 并且有兴趣将我的应用程序制作为跨桌面配置尽可能兼容 我已经知道可以将

随机推荐

  • 为什么 Chrome 会在空白字段上显示“请填写此字段”工具提示?

    我的客户联系我说 用户抱怨说某些字段现在显示带有消息 请填写此字段 的工具提示 我简直不敢相信我所听到的 但客户是对的 使用最新的 Chrome 版本 某些字段会显示带有此消息的浏览器工具提示 甚至与我的验证器并排 有什么问题 我缺少什么
  • C#语言设计支柱

    In the article http www artima com intv nonvirtualP html http www artima com intv nonvirtualP html http www artima com i
  • std::allocator 中“销毁”“析构函数”“解除分配”之间的区别?

    In C std allocator 存在与共同概念相关的三种方法 deallocate destroy 析构函数 我想知道 从内存管理的角度来看 它们有何不同 我什么时候应该使用这个而不是那个 谢谢你 编辑 更具体的疑问 很抱歉一开始就笼
  • C# 中的复数和本地化字符串

    我有一个 C WPF 应用程序 我正在尝试使用 resx 文件进行全球化 效果非常好 然而 我遇到了麻烦 我有一个相对简单的复数解决方案 其中我显示的字符串有单数和复数形式 我根据我正在谈论的任何事物的数量选择一个 然而 我最近接受了这样一
  • 当我回来或结束时如何重置我的控制器?

    我有一个 QuestionController 类扩展GetxController 当我使用控件退出页面时 我希望它停止工作 因为它仍在后台运行 并在我返回该页面时重新启动 我试过了 我在路线之后添加了这些ScoreScreen in ne
  • 在管理中合并用户和用户配置文件

    我一直在阅读 Django 对用户和配置文件的分离 并且我决定使用一个名为 UserProfile 的模型 该模型位于帐户应用程序中作为我的配置文件 问题是 现在我有两个独立的管理区域 一个用于修改用户 一个用于修改用户配置文件 是否可以在
  • Word 插件 获取完整的文档文本?

    我正在使用以下命令编写一个 Office addinYeoman 办公室发电机 https github com OfficeDev generator office 基于这些说明 https dev office com getting
  • 运行 SqlQuery EF 时 FieldNameLookup.GetOrdinal 中索引超出范围异常

    我们最终得到一个索引超出范围运行这样的代码时出现异常 result Data dbOptima Database ExecuteStoredProcedure task StoredProcedureValues PROC GET TASK
  • Python中的时间序列分解函数

    时间序列分解是一种将时间序列数据集分成三个 或更多 分量的方法 例如 x t s t m t e t where t is the time coordinate x is the data s is the seasonal compon
  • firebase 函数 Puppeteer 找不到 Chromium GCP

    我已经在谷歌云上使用GCP很长时间了 我想运行一个使用Puppeteer的云函数 但不幸的是 我收到以下错误 未处理的错误错误 找不到 Chromium 修订版 1069273 如果出现以下任一情况 就会发生这种情况 您在运行脚本之前没有安
  • 比较 JPA Criteria API 中的日期实体

    使用 JPA 2 和 EclipseLink 实现 我正在尝试构建一个动态查询 它应该为我带来一些在给定日期之后保留的记录 CriteriaBuilder builder em getCriteriaBuilder CriteriaQuer
  • 如何为 WongKinYiu/Yolov7 姿势估计准备自定义关键点数据集?

    如何准备自定义关键点数据集黄建耀 yolov7 https github com WongKinYiu yolov7 pose estimation 关键点格式描述如下 https cocodataset org format data h
  • 气流中任务的粒度

    对于一项任务 有许多辅助任务 从文件 数据库获取 保存属性 验证 审核 这些辅助方法并不耗时 一个样本 DAG 流 fetch data gt gt actual processing gt gt validation gt gt save
  • Paperclip:如何在 Rails 控制台中存储图片?

    我尝试将本地图像存储在 Rails 控制台中 因为我的本地存储中有很多图片 我使用爬虫下载大量图片 所以我想将它们存储到数据库中 利用回形针来完成一些图像工作 例如缩略图等 如果我使用网页将新图片一张一张保存到数据库中 会花费很多时间 所以
  • 使用 Rails 和 ActiveMerchant 进行定期计费:最佳实践、陷阱、陷阱?

    我们正在准备发布一个大型 Web 应用程序 该应用程序已经开发了一年 我们即将开始集成 ActiveMerchant 来处理该服务的经常性订阅费用 我正在寻找有关考虑我们的要求 如下所列 的最佳实践的任何建议 以及针对常见陷阱或我应该特别考
  • 如何使用 jQuery 将一个 HTML 块替换为另一个 HTML 块

    我想替换以下 html 块 table class t12PageBody cellpadding 0 cellspacing 0 width 100 tr td REGION POSITION 01 td tr table table w
  • 更新插入交易

    我将 Spring 与 PostgreSQL 结合使用 并尝试使用如下代码执行某种 UPSERT jt update delete from A where id 1 jt update insert into A id value val
  • 解析文本区域中的换行符而不允许所有 html 标签

    我有一个文本区域字段 用户可以在其中输入内容 当涉及到在页面上显示他们的条目时 rails 返回 n对于每个换行符 在页面上的 html 中显示为根本没有换行符 据我所知 解决这个问题的标准方法是 gsub命令 替换 n with br 然
  • C# 如何注销 Citrix XenApp 用户会话?

    由于 Citrix 关于其 SDK 的文档绝对为零 因此我在此记录这一点 使用 C 如何以编程方式注销用户会话 使用下面的简单方法通过解析会话并注销单个会话来注销用户会话 using Citrix Common Sdk using Citr
  • Qt/Qml 和方法重载

    刚刚在 Qml 中调用重载的 C 方法时遇到了 Qt 框架的奇怪行为 并试图了解其背后的原因 假设我有一个QList