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 函数?的主要内容,如果未能解决你的问题,请参考以下文章
在 QtCreator 中从 Qt 调用 fortran 代码