Qt中的自定义类型

将自定义类型加入元对象系统(meta-object system),可以获得运行时类型、信号槽等Qt特性支持。

1、自定义类型必须至少满足以下3个条件:

   1)1个公有默认构造函数;
   2)1个公有拷贝构造函数:
   3)1个公有析构函数。

2、使用QMetaType声明类型:

在头文件中使用Q_DECLARE_METATYPE宏声明类型:

1
Q_DECLARE_METATYPE(UserDefinedType);
使用该宏声明类型后,Qt可以将自定义类型的值以QVariant类型存储;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#ifndef MESSAGE_H
#define MESSAGE_H
#include <QDebug>
#include <QMetaType>
#include <QStringList>

class Message
{
public:
    Message();
    Message(const Message &other);
    ~Message();


    Message(const QString &body, const QStringList &headers);


    QString body() const;
    QStringList headers() const;


private:
    QString m_body;
    QStringList m_headers;
};

Q_DECLARE_METATYPE(Message);
QDebug operator<<(QDebug dbg, const Message &message);
#endif

以上两步骤完成后,该自定义类型仅能作为直接连接(线程内)的信号槽函数的参数使用。按照文档

“This is because the meta-object system does not know how to handle creation and destruction of objects of the custom type at run-time.”

如果需要跨线程使用自定义类型,那么必须继续完成以下步骤:

3、使用qRegisterMetaType模板函数向系统注册该自定义类型。 如:qRegisterMetaType<Block>();,注册后,该类型可以用于信号槽机制中(无论是线程内,还是线程间)

1
2
3
4
5
6
7
8
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    ...
    qRegisterMetaType<Block>();
    ...
    return app.exec();
}
参见:

http://doc.qt.io/qt-5/custom-types.html

本文来自:Qt中的自定义类型