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