QT c++ QObject::connect函数 线程给界面发送数据
在项目开发时,常常需要用线程采集数据,如果要给界面发送数据,本文是其中的一种办法,
第一步:在线程类里定义一个信号函数,通过emit关键字发送出去,
第二步:在界面类里定义一个槽函数接收信息,注意信号函数和槽函数的参数类型和个数要一样。
第三步:用 连接信号和槽的函数,是实现对象间通信的重要机制。
它允许信号发出时自动调用相应的槽函数,从而实现对象之间的解耦和灵活的交互。
它的原型是:bool QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType type = Qt::AutoConnection);
- sender:信号发送者的指针。
- signal:要连接的信号名称。
- receiver:信号接收者的指针。
- member:接收信号时调用的槽函数名称。
- type:连接类型,默认为自动连接(Qt::AutoConnection)。
常见问题及解决方法
无效的空指针:如果遇到 QObject::connect: invalid null parameter
错误,通常是因为连接的指针为空或未正确初始化。确保在连接信号和槽之前,相关对象已被正确创建和初始化。
重载函数歧义:在使用 QObject::connect
时,如果信号或槽函数被重载,可能会导致连接失败。确保在连接时指定正确的函数版本,可以通过使用静态类型转换或明确指定函数参数来解决。
例子
1.线程
(1)头文件
#ifndef THREAD1_H
#define THREAD1_H
#include <QThread>
#include <QDebug>
class Thread1 : public QThread
{
Q_OBJECT
public:
explicit Thread1(QObject *parent = nullptr);
signals:
void send_info(int value);
protected:
void run() override; //线程的循环
private:
int seq=0;
};
#endif // THREAD1_H
(2)cpp文件
#include "thread1.h"
Thread1::Thread1(QObject *parent)
: QThread{parent}
{
}
void Thread1:: run()
{ qDebug()<<"void Thread1:: run()";
while(1)
{
QThread::msleep(100);
seq++;
emit send_info(seq);
}
}
2.界面
(1)头文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "thread1.h"
#include <QString>
#include <QDebug>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
public slots:
void receive_info(int i);
private:
Ui::Widget *ui;
Thread1 * thread1;
};
#endif // WIDGET_H
(2)cpp文件
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
thread1=new Thread1(this);
QObject::connect(thread1,
SIGNAL(send_info(int)),
this,
SLOT(receive_info(int))
);
thread1->start();
}
Widget::~Widget()
{
delete ui;
}
void Widget::receive_info(int i)
{
ui->plainTextEdit->setPlainText(QString::number(i));
//qDebug()<<"-";
}