Qt文档阅读笔记-关于Q_DECLARE_METATYPE原理以及使用
目录
官方解释
博主补充小栗子
最简单的关于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原理以及使用相关推荐
- Qt文档阅读笔记-qRegisterMetaType()的原理及其使用
目录 官方介绍 博主栗子 官方介绍 调用这个函数去注册类型T,这个T要使用Q_DECLARE_METATYPE()进行声明,返回meta type id,如下: int id = qRegisterM ...
- Qt文档阅读笔记-共享库的创建与调用
使用共享库的符号 这个符号可以作用在变量.类.函数中,并且这些都可以被调用端使用. 在编译共享库中,需要使用export符号.在使用端调用的时候使用import符号. 这里是本人从文档中记录的笔记,大 ...
- Qt文档阅读笔记-加载HeightMap(高度图)构造3D地形图
Qt文档阅读笔记-加载HeightMap(高度图)构造3D地形图 QHeightMapSurfaceDataProxy:是Q3DSurface的一个基本代理类. 他是专门加载高度图. 高度图是没有X, ...
- Qt文档阅读笔记-Rotations Example相关
Rotations Example文档阅读笔记 使用这种方式,对y轴和z轴进行旋转. QQuaternion yRotation = QQuaternion::fromAxisAndAngle(0.0 ...
- Qt文档阅读笔记-Q_PROPERTY解析及实例
目录 官方解析 博主栗子 官方解析 这个宏用于继承于QObject的类声明属性.这样声明后的属性行为与类数据成员一样,但是他们可以通过元对象系统进行访问. Q_PROPERTY(type name(R ...
- Qt文档阅读笔记-QWebEngineView及QML WebEngineView
这里主要是最近有给Java Web项目及Qt项目需要混合,自己搞的QtWebEngine没有问题,而用了项目里面的,就有问题,在此阅读下官方资料,看看能不能解决这样莫名其妙的问题,在此记录下本次的阅读 ...
- Qt文档阅读笔记-moc工具使用及其理论(moc工具如何添加到makefile中)
moc(Meta-Object Compiler):用于处理Qt中关于C++的扩展. moc工具读取C++头文件,看看这个头文件里面的类是不是包含Q_OBJECT宏,它会将这个头文件,转换为带有met ...
- Qt文档阅读笔记-Fortune Client Example实例解析
目录 官方解析 实例代码 博主增加解析 官方解析 Fortune Client Example 以使用QTcpSocket为例子,服务端可以配合Fortune Server或Threaded Fort ...
- Qt文档阅读笔记-对Style Plugin Example实例的解析
目录 前言 Style Plugin Example SimpleStylePlugin Class 定义 SimpleStylePlugin Class 实现 main()函数 The Simple ...
最新文章
- 「SAP技术」MIGO 343 解冻物料库存的同时可以更改存储地点
- 华为首款Harmonyos摄像头,掀起家居安防大变革 华为首款HarmonyOS智能摄像头发布...
- oracle之二控制文件
- 小猪笔记本电脑装linux时需要以下命令
- 圆锥破碎机常见故障_圆锥破碎机飞车危害大! 7种原因早知道早预防
- Qt工作笔记-绘制静态折线图
- 二叉树类型笔试面试题大总结(含代码)
- cds5516舵机控制程序_[电力世界]中的应用程序CDS
- 改良版class选择器
- Google 搜索命令
- 【缅怀妈妈系列诗歌】之一:去医院的路,好长
- Android RSASHA加密
- jike2012年5月实习题
- 搜狗细胞词库解析(仅提取词和词频)
- RestAssured接口自动化框架学习
- MAC里“微软雅黑”字体标准体和粗体无法同时使用问题的解决方法
- 朗豫:储备池和借贷是MOV重点发力的方向
- 【转】人不成熟的几大特征——海尔集团CEO张瑞敏演讲稿
- Android组件化开发
- 架构师害怕程序员知道的十项技能的读后感