QT 信号和槽的应用

12 篇文章 1 订阅

1. 信号和槽

信号和槽的前提条件:
自定义类要想利用信号和槽机制,需要继承QObject类。同时在类的开始定义宏Q_OBJECT

在这里插入图片描述

信号和槽的声明形式:

  • private slots:

在这里插入图片描述

  • signals:信号只需要声明,不需要对其进行实现。信号没有返回值,只能是void类型。
    在这里插入图片描述

信号和槽的3种写法:

在这里插入图片描述

2.案例实现

工作中需要对一个图片数据文件进行读解析,需要把每一帧数据显示出来,当读出每一帧数据就发送信号,每一帧数据类型是char*类型;需要在窗口中加一个控件label,label需要实时显示帧数据。

  • 文件处理类 ITAProcess
  • ITAProcess.h
#ifndef ITAPROCESS_H
#define ITAPROCESS_H
#include <QObject>

class ITAProcess:public QObject{
    Q_OBJECT;
public:
    explicit ITAProcess(QObject* parent=nullptr);
    void Process();
signals:
    //传递数据
    void TransferData(char* srcData);

};

#endif // ITAPROCESS_H

  • ITAProcess.cpp
#include"ITAProcess.h"
#include <fstream>
#include <iostream>
#include<QDebug>
#include <QThread>

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

void ITAProcess::Process(){
    std::ifstream in;
    in.open("F:\\QT Project\\ITA_demo\\text.txt",std::ios::in);
    if(!in.is_open()){
        qDebug()<<"file open failed"<<endl;
    }
    char* buf = new char[5];
    while(!in.eof()){
        in.read(buf,5);
        emit TransferData(buf);
        qDebug()<<"buf:"<<buf<<endl;
        QThread::msleep(2000);
    }
    delete []buf;
    qDebug()<<"end"<<endl;
}
  • 窗口显示
  • mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include"ITAProcess.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    //处理文件传递过来的数据
    void HandleImageData(char* srcData);

    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
    ITAProcess ITA_;
};
#endif // MAINWINDOW_H

-mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QString>
#include<QDebug>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
//    connect(&ITA_,&ITAProcess::TransferData,[=](char* value){
//        HandleImageData(value);
//    });
    //connect(&ITA_,&ITAProcess::TransferData,this,&MainWindow::HandleImageData);
    connect(&ITA_,SIGNAL(TransferData(char*)),this,SLOT(HandleImageData(char*)));
}

void MainWindow::HandleImageData(char* srcData){
    qDebug()<<"catch srcData:"<<srcData<<endl;
    ui->label->setText(QString(srcData));
    repaint();
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{
    ITA_.Process();
}

-执行文件

  • main.cpp
#include "mainwindow.h"

#include <QApplication>

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alex1_Code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值