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

时间:2011-10-21 07:24:44

标签: qt4 invoke

美好的一天!

从Qt 4.7.3 docs不清楚可以使用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;
    }

我认为是时候报告bug&amp;功能请求,但也许某种程度上这些问题可以解决?

更新:

错误reported

建议reported

1 个答案:

答案 0 :(得分:2)

问题是 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; }
};

但是我不确定为什么你想拥有一个invokable属性,因为你已经可以用QObject::property读取任何属性。