C++ 我无法从QMetaObject获取方法,方法偏移量和计数相等
我有一个从QObject继承的类,并且有Q_OBJECT宏:C++ 我无法从QMetaObject获取方法,方法偏移量和计数相等,c++,qt,metaobject,C++,Qt,Metaobject,我有一个从QObject继承的类,并且有Q_OBJECT宏: class SomeClass: public QObject { Q_OBJECT public: SomeClass(QObject *parent = 0); void method1(); void method2(); ... }; 在同一标头中的另一个类中,我创建该类的实例,然后尝试从“SomeClass”获取所有方法并将其存储在QMap中: this->someclass
class SomeClass: public QObject
{
Q_OBJECT
public:
SomeClass(QObject *parent = 0);
void method1();
void method2();
...
};
在同一标头中的另一个类中,我创建该类的实例,然后尝试从“SomeClass”获取所有方法并将其存储在QMap中:
this->someclass = new SomeClass(); // in constructor.
cout这句话有点模棱两可
首先我们看到:
方法()和方法计数()提供有关类的
元方法(信号、插槽和其他可调用的成员函数)
但后来:
int QMetaObject::methodCount()const返回
此类,包括每个基提供的属性数
班级。这些包括信号和插槽以及正常成员
功能
但实际上,我们无法通过Qt元对象系统访问“普通”方法
因此,要访问您的方法,您应该使用Q\u INVOKABLE
宏声明它们:
Q_INVOKABLE void method1();
Q_INVOKABLE void method2();
对于希望在QMetaObject
中看到的每个方法,都需要使用Q\u INVOKABLE
宏
:
Q_可调用
将此宏应用于成员函数的声明,以允许通过元对象系统调用它们。宏写在返回类型之前,如下例所示:
class Window : public QWidget {
Q_OBJECT
public:
Window();
void normalMethod();
Q_INVOKABLE void invokableMethod(); };
invokableMethod()函数使用Q_INVOKABLE进行标记,使其在元对象系统中注册,并使其能够使用QMetaObject::invokeMethod()调用。由于normalMethod()函数不是以这种方式注册的,因此无法使用QMetaObject::invokeMethod()调用它
也可以使用插槽
宏。不过,我认为Q_INVOKABLE
可能更简单
QMetaObject只知道信号、插槽、属性和其他可调用的成员函数,偶尔作为一个组称为“元方法”
另外,对于示例的第一行,您应该(可能)调用
const QMetaObject *metaobj = someClass->metaObject();
这不仅仅是表面上的。dynamic\u cast
会将类型检查移动到运行时,如果您在编译时知道someClass
是指向QObject
派生类的指针,则无需执行此操作。(dynamic_cast
ing toQObject*
将起作用,并且由于虚拟继承,将为您获得正确的QMetaObject,但这是不必要的、不安全的和不清楚的。)
实际上,您不需要类的实例来获取元对象:
const QMetaObject *metaobj = SomeClass::staticMetaObject();
这是可能的,因为每个类(而不是每个对象)有一个QMetaObject
对于任何想了解更多元对象系统的人,我推荐咖啡和。通常,您不需要直接处理QMetaObject实例,除非您正在编写一个脚本引擎或类似的“meta”代码。很容易无意中复制Qt已经提供的功能
另外,Q\u DECLARE\u METATYPE
不是您想要的。尝试将您的类声明为一个元类型,注意链接的文档是Qt5,而问题似乎是关于Qt4(因为它使用QMetaMethod::signature())@Frank Osterfeld我不知道:)虽然文档5、4.6、4.7对methodCount()
说的是相同的,但不同,它直接说:“使用Q_INVOKABLE宏声明的成员函数”。你是对的,文档中存在歧义,并且宏Q_INVOKABLE为QMetaObject提供了一个方法,但在我的代码中,还需要使用SomeClass的staticMetaObject,而不是某个实例的meta对象。一切正常,另外,在使用StaticMetaObject之前,我一直在使用Q_INVOKABLE,但不起作用,现在一切正常:)好的,很高兴我能帮上忙。我想知道为什么metaObject()不起作用,肯定还有一些事情我不明白。在基类中的虚拟方法前面添加Q\u INVOKABLE
宏就足够了,还是必须将它也添加到派生类中的方法中?应该是const QMetaObject metaobj=SomeClass::staticMetaObject代码>
const QMetaObject *metaobj = SomeClass::staticMetaObject();