无法使用 QMetaObject::invokeMethod() 调用 Q_PROPERTY 方法

发布于 2024-12-11 13:03:11 字数 1281 浏览 0 评论 0原文

再会!

从 Qt 4.7.3 文档开始,尚不清楚是否可以使用 QMetaObject::invokeMethod() 调用属性。但真正奇怪的是,这两个调用都失败了:

class A : public QObject
{
  Q_OBJECT

  public:

    Q_PROPERTY( int value READ value )

    int value() { return 0; }

    Q_PROPERTY( int invokableValue READ invokableValue )

    Q_INVOKABLE int invokableValue() { return 0; }
};

...

int returnValue;

QMetaObject::invokeMethod( aPtr, "value"
                           , Q_RETURN_ARG( int, returnValue ) );

QMetaObject::invokeMethod( aPtr, "invokableValue"
                           , Q_RETURN_ARG( int, returnValue ) );

这意味着 Q_PROPERTY 禁止使用 Q_INVOKABLE。

让我们看看a_moc.cpp:

      if (_c == QMetaObject::InvokeMetaMethod) {
    // no calls here
    }
    #ifndef QT_NO_PROPERTIES
      else if (_c == QMetaObject::ReadProperty) {
    void *_v = _a[0];
    switch (_id) {
    case 0: *reinterpret_cast< int*>(_v) = value(); break;
    case 1: *reinterpret_cast< int*>(_v) = invokableValue(); break;
    }

我认为是时候报告错误了&功能请求,但也许可以通过某种方式解决这些问题?

更新:

错误报告

建议报告

Good day!

From Qt 4.7.3 docs isn't clear can be properties called using QMetaObject::invokeMethod() or not. But what really strange that are both calls failed:

class A : public QObject
{
  Q_OBJECT

  public:

    Q_PROPERTY( int value READ value )

    int value() { return 0; }

    Q_PROPERTY( int invokableValue READ invokableValue )

    Q_INVOKABLE int invokableValue() { return 0; }
};

...

int returnValue;

QMetaObject::invokeMethod( aPtr, "value"
                           , Q_RETURN_ARG( int, returnValue ) );

QMetaObject::invokeMethod( aPtr, "invokableValue"
                           , Q_RETURN_ARG( int, returnValue ) );

It means, that Q_PROPERTY forbids Q_INVOKABLE using.

Let's see a_moc.cpp:

      if (_c == QMetaObject::InvokeMetaMethod) {
    // no calls here
    }
    #ifndef QT_NO_PROPERTIES
      else if (_c == QMetaObject::ReadProperty) {
    void *_v = _a[0];
    switch (_id) {
    case 0: *reinterpret_cast< int*>(_v) = value(); break;
    case 1: *reinterpret_cast< int*>(_v) = invokableValue(); break;
    }

I think it's time to report bug & feature request, but maybe somehow these problems can be solved?

UPDATE:

Bug reported.

Suggestion reported.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

花开柳相依 2024-12-18 13:03:11

问题是 moc 不是一个成熟的 C++ 解析器,它很容易误解你的代码。

它看不到 Q_INVOKABLE 宏,因为它紧接在 Q_PROPERTY 声明之后。如果您在属性后面添加分号(QtCreator 的语法荧光笔不会喜欢这样),或者如果您重新排序行,它将正常工作。

因此,例如以下代码可以工作:

class A : public QObject
{
    Q_OBJECT
    Q_PROPERTY( int value READ value )
    Q_PROPERTY( int invokableValue READ invokableValue )
public:
    int value() { return 0; }
    Q_INVOKABLE int invokableValue() { return 0; }
};

但我不确定为什么您想要拥有一个可调用的属性,因为您已经可以使用 QObject::property 读取任何属性。

The problem is that the moc is not a fully fledged C++ parser, and it can easily misinterpret your code.

It doesn't see the Q_INVOKABLE macro because it comes just after the Q_PROPERTY declaration. If you add a semi-colon after the property (QtCreator's syntax highlighter won't like that), or if you reorder the lines it will work correctly.

So, for example the following code works:

class A : public QObject
{
    Q_OBJECT
    Q_PROPERTY( int value READ value )
    Q_PROPERTY( int invokableValue READ invokableValue )
public:
    int value() { return 0; }
    Q_INVOKABLE int invokableValue() { return 0; }
};

But I'm not sure why you would want to have an invokable property, since you can already read any property with QObject::property.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文