Qt使用信号槽进行线程间通信必须要注意的是:
1.传递的参数必须是Qt的元类型(Metatype),如int, QString, double等。
2.参数为自定义数据类型,必须在连接槽函数前将其注册为元类型。
3.传递引用参数,参数前加const, 以确保引用参数的生命周期同程序一致。
一:子线程与主线程通信(参数为元类型)
1.新建子线程:发信号
#pragma once
#include <QObject>
#include <QThread>
class MyThread : public QThread
{
Q_OBJECT
public:
MyThread(QObject *parent = 0);
~MyThread();
protected:
void run();//重写QThread的run函数
signals:
void DisplaySignal(QString);
};
#include "MyThread.h"
MyThread::MyThread(QObject *parent)
: QThread(parent)
{
}
MyThread::~MyThread()
{
}
void MyThread::run()
{
emit DisplaySignal("12345");
}
2.主线程:接收信号,执行槽函数
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_QtRelated.h"
#include "MyThread.h"
class QtRelated : public QMainWindow
{
Q_OBJECT
public:
QtRelated(QWidget *parent = Q_NULLPTR);
private slots:
void Display(QString);
private slots:
void on_pbStart_clicked();
private:
Ui::QtRelatedClass ui;
MyThread* thread1;
};
#include "QtRelated.h"
QtRelated::QtRelated(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
thread1 = new MyThread();
connect(thread1, SIGNAL(DisplaySignal(QString)), this, SLOT(Display(QString)));
}
void QtRelated::Display(QString str)
{
ui.txtDisplay->setText(str);
}
void QtRelated::on_pbStart_clicked()
{
if (thread1 != nullptr)
{
thread1->start();
}
}
运行效果:
注意事项
1.基类必须是QObject,添加Q_OBJECT宏;
2.connect之前,发送方和接收方必须先创建;
3.connect之后,若发送方或接收方的指针指向新的实体,连接不会自动更新,需重建连接;
4.断开连接使用disconnect;
5.当发送方或接收方有一个销毁后,连接自动断开;
6.使用自定义的参数类型时,需先使用qRegisterMeteType注册该参数类型;
7.所有建立的连接会记录在一个列表,并通过锁保护,应尽量减少不必要的连接;