반응형
테스트 환경
Windows10 / C++ / Qt 5.15.2 / Qt Creator 4.13.3
목적
Qt Creator를 활용, 스레드에서 메인윈도우로 연속하여 데이터를 이동시킨다.
Thread와 MainWindow 클래스 간 데이터 이동
Thread 생성
아래 글을 참고하여 Thread를 생성한다.
thread.h
Thread클래스에 아래 라인을 추가한다.
아래 코드는 Thread 클래스에서 MainWindow클래스로 데이터를 보낼 함수를 선언한다.
signals:
void Send(int data);
Qt에서 클래스 간 통신은 signal과 slot로 이루어진다. signal은 데이터를 송신, slot은 수신하는 함수다. signal과 slot의 파라미터 자료형을 같게 하여 signal 함수의 파라미터 값을 slot 함수 파라미터 값으로 복사하는 방식으로 데이터가 이동된다.
#ifndef THREAD_H
#define THREAD_H
//#include "ui_mainwindow.h"
#include <QThread>
#include <QtDebug>
class Thread : public QThread
{
Q_OBJECT
public:
explicit Thread(QObject *parent = 0);
private:
void run();
signals:
void Send(int data);
};
#endif // THREAD_H
mainwindow.h
MainWindow클래스에 아래 라인을 추가한다.
private slots:
void Receive(int data);
메인윈도우에서 데이터를 받을 함수는 Receive로 선언한다.
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "ui_mainwindow.h"
#include "thread.h"
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
Thread *thread;
private slots:
void Receive(int data);
};
#endif // MAINWINDOW_H
thread.cpp
스레드의 run함수를 수정한다.
void Thread::run()
{
int i = 0;
while(1)
{
i++;
emit Send(i);
}
}
emit을 사용하여 Send함수의 매개변수를 송신한다. 위 코드는 메인윈도우로 1부터 1씩 증가하는 값을 무한히 보낸다.
#include "thread.h"
Thread::Thread(QObject *parent) :
QThread(parent)
{
}
void Thread::run()
{
int i = 0;
while(1)
{
i++;
emit Send(i);
}
}
mainwindow.cpp
mainwindow.cpp 파일에 아래 라인을 추가한다.
connect(thread, SIGNAL(Send(int)), this, SLOT(Receive(int)));
connect(보낼 클래스, SIGNAL(보낼 함수(파라미터), 받을 클래스, SLOT(받을 함수(파라미터)))
connect 함수는 만들어둔 Send함수와 Receive함수를 연결시킨다.
스레드에서 Send로 데이터를 송신하면 Receive 함수가 수행된다. 아래 코드는 수신받은 데이터를 곧바로 출력한다.
void Thread::Receive(int data)
{
qDebug() << data;
}
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
thread = new Thread(this);
thread->start();
connect(thread, SIGNAL(Send(int)), this, SLOT(Receive(int)));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::Receive(int data)
{
qDebug() << data;
}
결과 확인
0부터 값이 순차적으로 출력되는것을 확인할 수 있다.
최근댓글