无法使用 QMetaObject::invokeMethod() 调用 Q_PROPERTY 方法
再会!
从 Qt 4.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_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;
}
我认为是时候报告错误了&功能请求,但也许可以通过某种方式解决这些问题?
更新:
错误报告。
建议报告。
Good day!
From Qt 4.7.3 docs isn't clear can be properties called using QMetaObject::invokeMethod() or not. But what really strange that are both calls failed:
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 ) );
It means, that Q_PROPERTY forbids Q_INVOKABLE using.
Let's see 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;
}
I think it's time to report bug & feature request, but maybe somehow these problems can be solved?
UPDATE:
Bug reported.
Suggestion reported.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
问题是 moc 不是一个成熟的 C++ 解析器,它很容易误解你的代码。
它看不到
Q_INVOKABLE
宏,因为它紧接在Q_PROPERTY
声明之后。如果您在属性后面添加分号(QtCreator 的语法荧光笔不会喜欢这样),或者如果您重新排序行,它将正常工作。因此,例如以下代码可以工作:
但我不确定为什么您想要拥有一个可调用的属性,因为您已经可以使用
QObject::property
读取任何属性。The problem is that the moc is not a fully fledged C++ parser, and it can easily misinterpret your code.
It doesn't see the
Q_INVOKABLE
macro because it comes just after theQ_PROPERTY
declaration. If you add a semi-colon after the property (QtCreator's syntax highlighter won't like that), or if you reorder the lines it will work correctly.So, for example the following code works:
But I'm not sure why you would want to have an invokable property, since you can already read any property with
QObject::property
.