2011-10-21 72 views
1

美好的一天!無法使用QMetaObject :: invokeMethod調用Q_PROPERTY方法()

從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; 
    } 

我認爲這是一次報告錯誤&功能的要求,但可能在某種程度上,這些問題都可以解決?

UPDATE:

錯誤reported

建議reported

+0

你的問題是什麼? –

+0

也許我不應該在這裏發表,因爲這是問題描述,但不是問題。 –

+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; } 
}; 

但我不知道你爲什麼會想有一個可調用的性質,因爲你已經可以用QObject::property讀取任何財產。

+0

這只是爲了統一,因爲很多代碼使用「調用」 - 方式。 –

+0

你對分號絕對正確。無論如何,我會將這些問題指向開發人員。 –