Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我无法从QMetaObject获取方法,方法偏移量和计数相等_C++_Qt_Metaobject - Fatal编程技术网

C++ 我无法从QMetaObject获取方法,方法偏移量和计数相等

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

我有一个从QObject继承的类,并且有Q_OBJECT宏:

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 to
QObject*
将起作用,并且由于虚拟继承,将为您获得正确的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();