美好的一天!
从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。
答案 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
读取任何属性。