原对象系统之qRegisterMetaType

如果代码中用到了自定义类型,并且通过信号和槽传递信息的时候参数是该自定义类型,分三种情况

一、参数是自定义类型指针

信号发送端

#ifndef __MAIN_WINDOW_H_
#define __MAIN_WINDOW_H_

#include <QMainWindow>
#include <QThread>
#include <QPushButton>
#include "InheritObject.h"

class MainWindow:public QMainWindow
{
	Q_OBJECT
public:
	explicit MainWindow(QWidget *parent = 0);
private slots:
	void on_sendObjectPointer_clicked();
signals:
	void sendObjectPointer(MyObject*);
	
private:
	QThread *m_th;
	InheritObject *m_obj;
	void InitUi();
};

#endif __MAIN_WINDOW_H_
#include "MainWindow.h"
#include <QGridLayout>
#include <QDebug>
#include "MyObject.h"

MainWindow::MainWindow(QWidget *parent):QMainWindow(parent)
{
	qDebug()<<"GUI thread = "<<QThread::currentThreadId();
	InitUi();
	m_th = new QThread();
	m_obj = new InheritObject();
	m_obj->moveToThread(m_th);
	
	connect(this,&MainWindow::sendObject,m_obj,&InheritObject::onReceiveObject);
	connect(this,&MainWindow::sendObjectRef,m_obj,&InheritObject::onReceiveObjectRef);
	connect(this,&MainWindow::sendObjectPointer,m_obj,&InheritObject::onReceiveObjectPointer);
	//启动线程,线程默认开启事件循环,并且线程正处于事件循环状态
	m_th->start();
}

void MainWindow::InitUi()
{
	QWidget *pWidget = new QWidget(this);
	
	QGridLayout *pLayout = new QGridLayout();
	QPushButton *pSendObjectPointer = new QPushButton("SendObjectPointer",this);
	pLayout->addWidget(pSendObjectPointer,0,1);
	connect(pSendObjectPointer,&QPushButton::clicked,this,&MainWindow::on_sendObjectPointer_clicked);
	
	pWidget->setLayout(pLayout);
	this->setCentralWidget(pWidget);
}

void MainWindow::on_sendObjectPointer_clicked()
{
	MyObject *pMyObject = new MyObject();
	pMyObject->age = 23;
	pMyObject->name = "wangmeng";
	emit sendObjectPointer(pMyObject);
}

槽函数端

#ifndef __INHERIT_OBJECT_H_
#define __INHERIT_OBJECT_H_

#include <QObject>
#include "MyObject.h"

class InheritObject:public QObject
{
	Q_OBJECT
public:
	explicit InheritObject(QObject *parent = 0);
public slots:
	void onReceiveObjectPointer(MyObject *pObject);

private:
	QVariant myVariant;
};

#endif
#include "InheritObject.h"
#include <QDebug>
#include <QThread>

InheritObject::InheritObject(QObject *parent):QObject(parent)
{
	
}

void InheritObject::setMyObject(QVariant variant)
{
	myVariant = variant;
}

void InheritObject::onReceiveObjectPointer(MyObject *pObject)
{
	qDebug()<<(QString(" %1 %2 ").arg(pObject->age).arg(pObject->name));
}

自定义对象

#ifndef __MY_OBJECT_H_
#define __MY_OBJECT_H_
#include <QObject>
#include <QDebug>
#include <QThread>
class MyObject
{

public:
	MyObject()
	{
		qDebug()<<"function  "<<__FUNCTION__<<this<<QThread::currentThreadId();
	}
	
	MyObject(const MyObject& object)
	{
		qDebug()<<"function  copy "<<__FUNCTION__<<this<<QThread::currentThreadId();
		this->age = object.age;
		this->name = object.name;
	}
	~MyObject()
	{
		qDebug()<<"function  "<<__FUNCTION__<<this<<QThread::currentThreadId();
	}
	int age;
	QString name;	
};

#endif

主函数入口

#include <QApplication>
#include "MainWindow.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
	MainWindow w;
	w.show();
    return app.exec();
}

结论

不需要额外的操作,可以直接发送和接收

二、参数为自定义类型对象

信号发送端修改

void sendObjectPointer(MyObject*);
修改为
void sendObject(MyObject);

void on_sendObjectPointer_clicked();
修改为
void on_sendObject_clicked();

connect(this,&MainWindow::sendObjectPointer,m_obj,&InheritObject::onReceiveObjectPointer);
修改为
connect(this,&MainWindow::sendObject,m_obj,&InheritObject::onReceiveObject);

QPushButton *pSendObjectPointer = new QPushButton("SendObjectPointer",this);
pLayout->addWidget(pSendObjectPointer,0,1);
connect(pSendObjectPointer,&QPushButton::clicked,this,&MainWindow::on_sendObjectPointer_clicked);
修改为
QPushButton *pSendObject = new QPushButton("SendObject",this);
pLayout->addWidget(pSendObject ,0,1);
connect(pSendObject,&QPushButton::clicked,this,&MainWindow::on_sendObject_clicked);

void MainWindow::on_sendObject_clicked()
函数名及函数实现修改为
void MainWindow::on_sendObjectPointer_clicked()
{
	MyObject *pMyObject = new MyObject();
	pMyObject->age = 23;
	pMyObject->name = "wangmeng";
	emit sendObjectPointer(pMyObject);
}

槽函数端修改

void onReceiveObjectPointer(MyObject *pObject);
修改为
void onReceiveObject(MyObject object);

void InheritObject::onReceiveObjectPointer(MyObject *pObject)
函数名和函数实现修改为
void InheritObject::onReceiveObject(MyObject object)
{
	qDebug()<<(QString(" %1 %2 ").arg(object.age).arg(object.name));
}

主函数增加qRegisterMetaType

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
	qRegisterMetaType<MyObject>("MyObject");

	MainWindow w;
	w.show();
    return app.exec();
}

结论

如果不注册,运行的时候,报错
QObject::connect: Cannot queue arguments of type 'MyObject'
(Make sure 'MyObject' is registered using qRegisterMetaType().)

三、参数为自定义类型对象的引用

传递参数的时候传递对象的引用

signals:
	void sendObjectRef(MyObject&);

connect(pSendObjectRef,&QPushButton::clicked,this,&MainWindow::on_sendObjectRef_clicked);

void MainWindow::on_sendObjectRef_clicked()
{
	MyObject myObject;
	myObject.age = 23;
	myObject.name = "wanggang";
	emit sendObjectRef(myObject);
}

void InheritObject::onReceiveObjectRef(MyObject& object)
{
	qDebug()<<(QString(" %1 %2 ").arg(object.age).arg(object.name));
}

主函数增加qRegisterMetaType

qRegisterMetaType<MyObject>("MyObject&");

结论

如果不注册,运行的时候,报错
QObject::connect: Cannot queue arguments of type 'MyObject&'
(Make sure 'MyObject&' is registered using qRegisterMetaType().)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值