如果代码中用到了自定义类型,并且通过信号和槽传递信息的时候参数是该自定义类型,分三种情况
一、参数是自定义类型指针
信号发送端
#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().)