目录

官方解释

博主补充小栗子

最简单的关于Q_DECLARE_METATYPE的例子:

关于qRegisterMetaType的栗子


官方解释

Q_DECLARE_METATYPE(Type)

这个宏是为了让QMetaType知道Type这个数据类型,并提供一个默认的拷贝构造函数和析构函数。QVariant需要使用Q_DECLARE_METATYPE这个宏来定制类型。

当使用这个宏的时候要求Type是一个完整的数据类型。可以使用Q_DECLARE_OPAQUE_POINTER()来注册一个指针用于转发声明类型。

一般都把这个宏放到结构体或类的末尾【注意:这是官方说的】,如果不放到末尾也是阔以的,就放到头文件中,当你用 QVariant就要包含那个.h,个人觉得这非常不适合面向对象以及模块化编程。

通过添加Q_DECLARE_METATYPE()这个宏让QOject及其子类知道这个类型。这里要注意的是如果要在队列信号(关于connect函数队列信号请看这篇博文:https://blog.csdn.net/qq78442761/article/details/81937837)中使用或者用用槽连接,要先调用这个函数qRegisterMetaType()【这里是在运行的时候,对他进行注册】

下面是官方给出的一个小栗子:

  struct MyStruct{int i;...};Q_DECLARE_METATYPE(MyStruct)

栗子二:

  namespace MyNamespace{...}Q_DECLARE_METATYPE(MyNamespace::MyStruct)

以及如何在QVariant中使用的栗子:

  MyStruct s;QVariant var;var.setValue(s); // copy s into the variant...// retrieve the valueMyStruct s2 = var.value<MyStruct>();

下面这几个类型是自动注册的,不需要使用Q_DECLARE_METATYPE这个宏:
1.QObject继承下来的子类的指针;
2.QList<T>, QVector<T>, QQueue<T>, QStack<T>, QSet<T> or QLinkedList<T>这些T都是自动注册的;
3.QHash<T1, T2>, QMap<T1, T2> or QPair<T1, T2> T1,和T2都是自动注册的;
4.QPointer<T>, QSharedPointer<T>, QWeakPointer<T>这3个T必须是QObject的子类;
5.枚举类型要用Q_ENUM or Q_FLAG;
6.拥有Q_GADGET宏的类。

下面是我自己的例子,用于对Q_DECLARE_METATYPE这一知识点的补充!

博主补充小栗子

最简单的关于Q_DECLARE_METATYPE的例子:

源码如下:

mydatatype.h

#ifndef MYDATATYPE_H
#define MYDATATYPE_H#include <QMetaType>class MyDataType
{
public:MyDataType();int value_a;int value_b;int value_c;
};Q_DECLARE_METATYPE(MyDataType)#endif // MYDATATYPE_H

main.cpp

#include <QApplication>
#include "mydatatype.h"
#include <QVariant>
#include <QDebug>int main(int argc, char *argv[])
{QApplication a(argc, argv);MyDataType *myDataType=new MyDataType;QVariant var;var.setValue(*myDataType);qDebug()<<var;MyDataType my=var.value<MyDataType>();qDebug()<<my.value_a<<" "<<my.value_b<<" "<<my.value_c;delete myDataType;return a.exec();
}

mydatatype.cpp

#include "mydatatype.h"MyDataType::MyDataType()
{value_a=0;value_b=1;value_c=2;
}

运行截图如下:

关于qRegisterMetaType的栗子

关于qRegisterMetaType的解释,在明天将会给出官方的详细说明,在此先会用就阔以了!

源码如下:

mywidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H#include <QWidget>namespace Ui {
class MyWidget;
}struct MyData{QString str;
};Q_DECLARE_METATYPE(MyData)class MyWidget : public QWidget
{Q_OBJECTpublic:explicit MyWidget(QWidget *parent = 0);~MyWidget();signals:void sendData(MyData myWidget);public slots:void textChanged(QString str);private:Ui::MyWidget *ui;QString m_str;
};#endif // MYWIDGET_H

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include "mywidget.h"class MyWidget;namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();public slots:void btnClicked();void receiverData(MyData var);private:Ui::Widget *ui;MyWidget *m_mywidget;
};#endif // WIDGET_H

main.cpp

#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

mywidget.cpp

#include "mywidget.h"
#include "ui_mywidget.h"
#include <QDebug>MyWidget::MyWidget(QWidget *parent) :QWidget(parent),ui(new Ui::MyWidget)
{ui->setupUi(this);connect(ui->lineEdit,SIGNAL(textChanged(QString)),this,SLOT(textChanged(QString)));qRegisterMetaType<MyData>();
}MyWidget::~MyWidget()
{delete ui;
}void MyWidget::textChanged(QString str)
{MyData myData;myData.str=str;sendData(myData);
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);m_mywidget=new MyWidget;connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(btnClicked()));connect(m_mywidget,SIGNAL(sendData(MyData)),this,SLOT(receiverData(MyData)),Qt::QueuedConnection);
}Widget::~Widget()
{delete ui;
}void Widget::btnClicked()
{m_mywidget->show();
}void Widget::receiverData(MyData var)
{ui->lineEdit->setText(var.str);
}

运行截图如下:

继承于QObject的类,我就不演示了,因为C/C++中有个赋值兼容的知识点,估计就是通过这个赋值兼容,使得继承于QObject的类,QMetaType直接能够识别!自己进加到他的元对象系统!!!

Qt文档阅读笔记-关于Q_DECLARE_METATYPE原理以及使用相关推荐

  1. Qt文档阅读笔记-qRegisterMetaType()的原理及其使用

    目录 官方介绍 博主栗子 官方介绍 调用这个函数去注册类型T,这个T要使用Q_DECLARE_METATYPE()进行声明,返回meta type id,如下: int id = qRegisterM ...

  2. Qt文档阅读笔记-共享库的创建与调用

    使用共享库的符号 这个符号可以作用在变量.类.函数中,并且这些都可以被调用端使用. 在编译共享库中,需要使用export符号.在使用端调用的时候使用import符号. 这里是本人从文档中记录的笔记,大 ...

  3. Qt文档阅读笔记-加载HeightMap(高度图)构造3D地形图

    Qt文档阅读笔记-加载HeightMap(高度图)构造3D地形图 QHeightMapSurfaceDataProxy:是Q3DSurface的一个基本代理类. 他是专门加载高度图. 高度图是没有X, ...

  4. Qt文档阅读笔记-Rotations Example相关

    Rotations Example文档阅读笔记 使用这种方式,对y轴和z轴进行旋转. QQuaternion yRotation = QQuaternion::fromAxisAndAngle(0.0 ...

  5. Qt文档阅读笔记-Q_PROPERTY解析及实例

    目录 官方解析 博主栗子 官方解析 这个宏用于继承于QObject的类声明属性.这样声明后的属性行为与类数据成员一样,但是他们可以通过元对象系统进行访问. Q_PROPERTY(type name(R ...

  6. Qt文档阅读笔记-QWebEngineView及QML WebEngineView

    这里主要是最近有给Java Web项目及Qt项目需要混合,自己搞的QtWebEngine没有问题,而用了项目里面的,就有问题,在此阅读下官方资料,看看能不能解决这样莫名其妙的问题,在此记录下本次的阅读 ...

  7. Qt文档阅读笔记-moc工具使用及其理论(moc工具如何添加到makefile中)

    moc(Meta-Object Compiler):用于处理Qt中关于C++的扩展. moc工具读取C++头文件,看看这个头文件里面的类是不是包含Q_OBJECT宏,它会将这个头文件,转换为带有met ...

  8. Qt文档阅读笔记-Fortune Client Example实例解析

    目录 官方解析 实例代码 博主增加解析 官方解析 Fortune Client Example 以使用QTcpSocket为例子,服务端可以配合Fortune Server或Threaded Fort ...

  9. Qt文档阅读笔记-对Style Plugin Example实例的解析

    目录 前言 Style Plugin Example SimpleStylePlugin Class 定义 SimpleStylePlugin Class 实现 main()函数 The Simple ...

最新文章

  1. 「SAP技术」MIGO 343 解冻物料库存的同时可以更改存储地点
  2. 华为首款Harmonyos摄像头,掀起家居安防大变革 华为首款HarmonyOS智能摄像头发布...
  3. oracle之二控制文件
  4. 小猪笔记本电脑装linux时需要以下命令
  5. 圆锥破碎机常见故障_圆锥破碎机飞车危害大! 7种原因早知道早预防
  6. Qt工作笔记-绘制静态折线图
  7. 二叉树类型笔试面试题大总结(含代码)
  8. cds5516舵机控制程序_[电力世界]中的应用程序CDS
  9. 改良版class选择器
  10. Google 搜索命令
  11. 【缅怀妈妈系列诗歌】之一:去医院的路,好长
  12. Android RSASHA加密
  13. jike2012年5月实习题
  14. 搜狗细胞词库解析(仅提取词和词频)
  15. RestAssured接口自动化框架学习
  16. MAC里“微软雅黑”字体标准体和粗体无法同时使用问题的解决方法
  17. 朗豫:储备池和借贷是MOV重点发力的方向
  18. 【转】人不成熟的几大特征——海尔集团CEO张瑞敏演讲稿
  19. Android组件化开发
  20. 架构师害怕程序员知道的十项技能的读后感

热门文章

  1. elinks文字浏览器
  2. 选择大于努力!0基础学好C语言编程,首先要掌握的是什么?
  3. 2011年想要惊喜的5z20
  4. 飞鸽改变您的互联网生活
  5. 程序员减压方法100%有效
  6. 五款程序员专用辅助编程工具
  7. 再来一波不错的学习资源
  8. 白嫖一时爽,一直白嫖......?
  9. 2019年最好的前端进阶课,合同保障不过20w年薪全额退款!
  10. 当电信诈骗犯遇上程序员,技术决定成败!