Q_INVOKABLE 是不是需要在 Qt5 中从 QML 调用公共 QObject 函数?

Posted

技术标签:

【中文标题】Q_INVOKABLE 是不是需要在 Qt5 中从 QML 调用公共 QObject 函数?【英文标题】:Is Q_INVOKABLE needed to invoke a public QObject function from QML at all in Qt5?Q_INVOKABLE 是否需要在 Qt5 中从 QML 调用公共 QObject 函数? 【发布时间】:2016-02-11 09:39:17 【问题描述】:

我刚刚意识到,我几乎可以调用暴露给 QML 的对象的任何函数。现在我对 Q_INVOKABLE 很好奇。 Qt5 docs 状态:

[...] 任何 QML 代码都可以访问以下成员 QObject 派生类的实例:

属性

方法(前提是它们是公共插槽或标记为 Q_INVOKABLE)

信号

Since Qt5(在 C++ 中)我可以像插槽一样调用 QObject 的任何公共函数,即我不必将它们声明为“公共插槽”。这是否意味着我可以从 QML 调用任何方法?我在文档中找不到任何内容。

【问题讨论】:

“我可以像插槽一样调用任何公共函数”是什么意思。 ? 请提供一个从 QML 调用不可调用、非槽函数的最小示例。 在尝试提供我从 QML 调用不可调用、非槽函数的示例时,我意识到这是不可能的。哇,我不知道我是怎么相信它会起作用的……:/谢谢 【参考方案1】:

是的,你必须用 Q_INVOKABLE 标记你的 QObject 函数,除非它是 public slot 以便能够从 QML 调用它。

Q_INVOKABLE 和 slot 关键字都使用 Qt meta-system 注册您的函数。不同之处在于使用 Q_INVOKABLE 您可以返回值

【讨论】:

但是为什么我可以打电话给QModelIndex::row() 或QApplication::keyboardModifiers()?它们都不是插槽或 Q_INVOKABLE。 你不能从 QML 调用它们 顺便提一下,QModelIndex 甚至不是 QObject。 从技术上讲,插槽也可以返回值。但是,当插槽用作插槽(连接到信号)时,它们只会被忽略。在这种情况下,Q_INVOKABLE 是更好的风格。

以上是关于Q_INVOKABLE 是不是需要在 Qt5 中从 QML 调用公共 QObject 函数?的主要内容,如果未能解决你的问题,请参考以下文章

Q_INVOKABLE与invokeMethod用法全解

Q_INVOKABLE与invokeMethod用法全解

Q_INVOKABLE与invokeMethod用法全解

在 QtCreator 中从 Qt 调用 fortran 代码

在 Django 中从外键设置会话变量:需要字段名而不是主键

在 argparse 中从变量而不是命令行获取值