2011-10-21 6 views
1

おはよう!Q_PROPERTYメソッドはQMetaObject :: invokeMethod()を使用して呼び出すことはできません

Qt 4.7.3からは、QMetaObject :: invokeMethod()を使用して呼び出されたプロパティを明示できないかどうかを確認できません。しかし、どちらの呼び出しが本当に奇妙であるかは、両方とも失敗しました。つまり、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_PROPERTY宣言の直後であるため、Q_INVOKABLEマクロが表示されません。プロパティの後にセミコロンを追加すると(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

"invoke"を使っているコードが多いため、これは一貫性のためだけです。 –

+0

セミコロンについては間違いありません。とにかく、これらの問題をqt開発者に指示します。 –

関連する問題