Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt4 Q#u属性方法可以';不能使用QMetaObject::invokeMethod()调用_Qt4_Invoke - Fatal编程技术网

Qt4 Q#u属性方法可以';不能使用QMetaObject::invokeMethod()调用

Qt4 Q#u属性方法可以';不能使用QMetaObject::invokeMethod()调用,qt4,invoke,Qt4,Invoke,你好 Qt4.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 )

你好

Qt4.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_属性禁止Q_可调用的使用

让我们看看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;
    }
if(_c==QMetaObject::invokeMetetMethod){
//这里没有电话
}
#ifndef QT_无属性
else if(_c==QMetaObject::ReadProperty){
void*_v=_a[0];
开关(_id){
案例0:*重新解释转换(\u v)=值();中断;
案例1:*重新解释转换(\u v)=invokableValue();中断;
}
我认为是时候报告bug和特性请求了,但也许这些问题可以解决

更新:

臭虫

建议:

问题是,MOC不是一个完全成熟的C++分析器,它可以容易地误解您的代码。 它看不到
Q_INVOKABLE
宏,因为它紧跟在
Q_属性
声明之后。如果在属性之后添加分号(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

阅读任何属性了。也许我不应该在这里发布这个,因为这是问题描述,而不是问题。你可以通过询问其他人是否有类似的问题,或者设法解决这只是为了统一,因为很多代码都使用“invoke”方式。关于分号,你是绝对正确的。无论如何,我将把这些问题告诉qt开发人员。