当前位置: 首页 > news >正文

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()<<"-";
 }
 

相关文章:

  • JavaScript设计模式 -- 观察者模式
  • 《玩转AI大模型:从入门到创新实践》(8)第六章 进阶实战:定制你的AI大脑
  • Ollama本地部署DeepSeek+构建个人知识库笔记
  • C语言:数据的存储
  • 自动化测试实战
  • uake 网络安全 reverse网络安全
  • 2.7 静态方法/构造函数Mock
  • JAVA高级工程师-面试经历(含面试问题及解答)
  • 分享 UniApp 中超好看的卡片阴影样式
  • 【Stable Diffusion部署至Google Colab】
  • c/c++蓝桥杯经典编程题100道(19)质因数分解
  • 天芒传奇Ⅱ·前传-特殊武器
  • ds-download-link 插件:以独特图标选择,打造文章下载链接
  • 易仓科技ai面试
  • 关于uniapp使用pinia持久化配置兼容问题
  • 27、深度学习-自学之路-NLP自然语言处理-做一个简单的项目识别一组电影评论,来判断电影评论是积极的,还是消极的。
  • 【设计模式】【行为型模式】备忘录模式(Memento)
  • 【电脑】u盘重装win7
  • 国家2025年数字化污水厂政策与视频孪生赋能智慧污水厂建设
  • 【Kubernetes】常用命令全解析:从入门到实战(中)
  • 天津房地产集团网站建设/自制网站
  • 如何做中介网站/网站首页制作网站
  • 如何做网站宣传自己/网页设计模板素材图片
  • vps云主机可以做网站/产品线上营销推广方案
  • 网站设计公司推荐奇点网络/百度ocpc怎么优化
  • 开一个二手车销售网站怎么做/奶盘seo伪原创工具