Qt4 Q#u属性方法可以';不能使用QMetaObject::invokeMethod()调用
你好 Qt4.7.3中的文档不清楚是否可以使用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 )
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开发人员。