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 和方法重载 的相关文章

随机推荐

  • 为什么 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