반응형

테스트 환경


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

 

 

목적


Qt Creator를 활용, 다이얼로그에서 메인윈도우로부터 전달받은 데이터를 출력한다.

 

 

다이얼로그로 데이터 전달


다이얼로그 생성

아래 글을 참고하여 다이얼로그를 만든다. 다이얼로그는 모달, 모달리스 둘 다 상관없지만 아래 예제는 모달방식으로 구현되어있다.

 

[Qt, C++] 새 창을 띄우는 Dialog 사용(Modal, Modeless)

테스트 환경 Windows10 / C++ / Qt 5.15.2 / Qt Creator 4.13.3 목적 Qt Creator를 활용, 프로젝트를 실행 시 다이얼로그를 호출한다. 모달(Modal)과 모달리스(Modeless) 다이얼로그는 모달과 모달리스 두 종류가..

hydroponicglass.tistory.com

 

mainwindow.h

MainWindow 클래스에 아래 라인을 추가한다.

signals:
    void Send(int data);

Qt에서 클래스간 통신은 signal과 slot으로 이루어진다. signal은 데이터를 송신, slot은 수신하는 함수다. signal과 slot의 파라미터 자료형을 같게 하여 signal 함수의 파라미터 값을 slot 함수 파라미터 값으로 복사하는 방식으로 데이터가 이동된다. 위 코드에서 signal로 등록된 Send함수는 MainWindow에서 Dialog 클래스로 데이터를 보낼 함수다.

 

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

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

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;
    Dialog *dialog;

signals: // 추가
    void Send(int data); // 추가
};
#endif // MAINWINDOW_H

 

 

dialog.h

Dialog 클래스에 아래 라인을 추가한다.

private slots:
    void Receive(int data);

Dialog 클래스에서 데이터를 받을 함수는 Receive로 선언한다.

 

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = nullptr);
    ~Dialog();

private:
    Ui::Dialog *ui;

private slots:  // 추가
    void Receive(int data); // 추가
};

#endif // DIALOG_H

 

 

mainwindow.cpp

mainwindow.cpp에 아래 라인을 추가한다.

connect(this, SIGNAL(Send(int)), dialog, SLOT(Receive(int)));

connect 함수는 만들어둔 Send 함수와 Receive 함수를 등록한다.

connect(보낼 클래스, SIGNAL(보낼 함수(파라미터), 받을 클래스, SLOT(받을 함수(파라미터)))

 

emit Send(999);

emit을 사용하여 Send함수의 파라미터를 송신한다. 다이얼로그에 999를 송신한다.

 

 

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    dialog = new Dialog ;
    connect(this, SIGNAL(Send(int)), dialog, SLOT(Receive(int))); // 추가
    emit Send(999); // 추가
    dialog->setModal(true);
    dialog->exec();
}

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

 

 

dialog.cpp

Receive함수를 구현한다.

void Dialog::Receive(int data)
{
    qDebug() << data;
}

mainwindow.cpp에서 emit Send(999)가 수행되면 Receive 함수가 수행된다. Receive함수는 999를 출력한다.

 

#include "dialog.h"
#include "ui_dialog.h"
#include "QDebug"

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
}

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

void Dialog::Receive(int data)
{
    qDebug() << data;
}