Qt文档阅读笔记-关于Q_DECLARE_METATYPE原理以及使用
?
目錄
官方解釋
博主補(bǔ)充小栗子
最簡(jiǎn)單的關(guān)于Q_DECLARE_METATYPE的例子:
關(guān)于qRegisterMetaType的栗子
?
官方解釋
Q_DECLARE_METATYPE(Type)
這個(gè)宏是為了讓QMetaType知道Type這個(gè)數(shù)據(jù)類(lèi)型,并提供一個(gè)默認(rèn)的拷貝構(gòu)造函數(shù)和析構(gòu)函數(shù)。QVariant需要使用Q_DECLARE_METATYPE這個(gè)宏來(lái)定制類(lèi)型。
當(dāng)使用這個(gè)宏的時(shí)候要求Type是一個(gè)完整的數(shù)據(jù)類(lèi)型。可以使用Q_DECLARE_OPAQUE_POINTER()來(lái)注冊(cè)一個(gè)指針用于轉(zhuǎn)發(fā)聲明類(lèi)型。
一般都把這個(gè)宏放到結(jié)構(gòu)體或類(lèi)的末尾【注意:這是官方說(shuō)的】,如果不放到末尾也是闊以的,就放到頭文件中,當(dāng)你用 QVariant就要包含那個(gè).h,個(gè)人覺(jué)得這非常不適合面向?qū)ο笠约澳K化編程。
通過(guò)添加Q_DECLARE_METATYPE()這個(gè)宏讓QOject及其子類(lèi)知道這個(gè)類(lèi)型。這里要注意的是如果要在隊(duì)列信號(hào)(關(guān)于connect函數(shù)隊(duì)列信號(hào)請(qǐng)看這篇博文:https://blog.csdn.net/qq78442761/article/details/81937837)中使用或者用用槽連接,要先調(diào)用這個(gè)函數(shù)qRegisterMetaType()【這里是在運(yùn)行的時(shí)候,對(duì)他進(jìn)行注冊(cè)】
下面是官方給出的一個(gè)小栗子:
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>();下面這幾個(gè)類(lèi)型是自動(dòng)注冊(cè)的,不需要使用Q_DECLARE_METATYPE這個(gè)宏:
1.QObject繼承下來(lái)的子類(lèi)的指針;
2.QList<T>, QVector<T>, QQueue<T>, QStack<T>, QSet<T> or QLinkedList<T>這些T都是自動(dòng)注冊(cè)的;
3.QHash<T1, T2>, QMap<T1, T2> or QPair<T1, T2> T1,和T2都是自動(dòng)注冊(cè)的;
4.QPointer<T>, QSharedPointer<T>, QWeakPointer<T>這3個(gè)T必須是QObject的子類(lèi);
5.枚舉類(lèi)型要用Q_ENUM or Q_FLAG;
6.擁有Q_GADGET宏的類(lèi)。
下面是我自己的例子,用于對(duì)Q_DECLARE_METATYPE這一知識(shí)點(diǎn)的補(bǔ)充!
?
博主補(bǔ)充小栗子
最簡(jiǎn)單的關(guān)于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_Hmain.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; }運(yùn)行截圖如下:
?
關(guān)于qRegisterMetaType的栗子
關(guān)于qRegisterMetaType的解釋,在明天將會(huì)給出官方的詳細(xì)說(shuō)明,在此先會(huì)用就闊以了!
源碼如下:
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_Hwidget.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_Hmain.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); }運(yùn)行截圖如下:
繼承于QObject的類(lèi),我就不演示了,因?yàn)镃/C++中有個(gè)賦值兼容的知識(shí)點(diǎn),估計(jì)就是通過(guò)這個(gè)賦值兼容,使得繼承于QObject的類(lèi),QMetaType直接能夠識(shí)別!自己進(jìn)加到他的元對(duì)象系統(tǒng)!!!
總結(jié)
以上是生活随笔為你收集整理的Qt文档阅读笔记-关于Q_DECLARE_METATYPE原理以及使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C++工作笔记-对继承的进一步认识
- 下一篇: Qt文档阅读笔记-TextEdit QM