QT中关于调用QMetaObject::newInstance()返回null的问题

最近在项目中需要将类作为参数传给其他类,根据情况在其他类中进行实例化,所以在传递的时候就不能进行实例化。

如果是用MFC的话,可以使用RUNTIME_CLASS(class_name)来实现,但QT里面就不能这么用了,于是想到了QT的QObject派生类中有一个静态变量staticMetaObject,可以在实例化前获取到类的相关信息,并且调用newInstance()进行实例化。

在实现过程中,遇到了newInstance()返回null的问题,就是实例化失败了,最后在查找了一些资料后,才发现需要在类的构造函数前,用Q_INVOKABLE来进行修饰,然后就完美解决问题。

下面总结下调用QMetaObject::newInstance()的几个必要条件:

1、类必须是继承QObject的类,并且包含Q_OBJECT宏;

2、类的构造函数必须要用Q_INVOKABLE来修饰,如下:

class ClassA : public QObject
{
    Q_OBJECT
public:
    Q_INVOKABLE ClassA(QObject *parent = nullptr);// 必须用Q_INVOKABLE修饰
 
signals:
 
public slots:
 
private:
 
};

以上两点是成功调用newInstance()进行类的实例化的必备条件,特此记录下来,给自己和给大家做个笔记。

你可能感兴趣的:(QT,qt,开发语言)