테스트 환경


Windows10 / C++ / Qt 5.15.2 / Qt Creator 4.13.3

 

 

목적


Qt Creator를 활용, 스레드에서 메인윈도우로 연속하여 데이터를 이동시킨다.

 

 

Thread와 MainWindow 클래스 간 데이터 이동


Thread 생성

아래 글을 참고하여 Thread를 생성한다.

 

[Qt, C++] Thread 사용

테스트 환경 Windows10 / C++ / Qt 5.15.2 / Qt Creator 4.13.3 목적 Qt Creator를 활용하여 스레드를 사용한다. Thread 사용 Thread 생성 프로젝트를 우클릭하고 Add new를 선택한다. New File 창이 뜨면 C++ Cl..

hydroponicglass.tistory.com

 

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부터 값이 순차적으로 출력되는것을 확인할 수 있다.