๋ฐ˜์‘ํ˜•

์†Œ๊ฐœ

Qt Creator๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด MFC๋ณด๋‹ค ๋” ์‰ฝ๊ณ  ๋” ์˜ˆ์œ UI ์ž‘์—…์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ, MFC๋กœ ๋ฉ‹์žˆ๋Š” Application์„ ๋งŒ๋“ค๋ ค๊ณ  ํ•˜๋ฉด ์ž‘์—…์ด ๋๋„ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณต๋˜๋Š” UI ์ปจํŠธ๋กค์˜ ํ•œ๊ณ„์ ์ด ํฌ๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .

๊ทธ๋ ‡๋‹ค๊ณ  Qt๋กœ ๋„˜์–ด๊ฐ€์ž๋‹ˆ ์ƒˆ๋กœ์šด ํˆด์„ ๋ฐฐ์šฐ๊ธฐ๊ฐ€ ๋ถ€๋‹ด์Šค๋Ÿฌ์šธ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ง€๋‚œ ๋ฒˆ์— Visual Studio & Qt Add-in์— ๋Œ€ํ•œ ์†Œ๊ฐœ๋ฅผ ํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.


์ด๋ฒˆ์—๋Š” Visual Studio 2017์—์„œ Qt Designer๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ UI ์ž‘์—…ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

โ€ป ์˜ˆ์ œ ํŒŒ์ผ์€ ํ•˜๋‹จ์— ์ฒจ๋ถ€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.


๋”ฐ๋ผํ•˜๊ธฐ

Visual Studio๋ฅผ ์‹คํ–‰ํ•˜๊ณ  Qt GUI Application ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Qt GUI Application ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ํ™”๋ฉด


๊ทธ๋Ÿฌ๋ฉด ์•„๋ž˜ ๊ทธ๋ฆผ ์ฒ˜๋Ÿผ Qt GUI Application Wizard๊ฐ€ ์ƒ์„ฑ๋˜๋Š”๋ฐ์š”.

'Next'๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

Qt GUI Application Wizard


๋‹ค์Œ์€ Qt Module์„ ์„ ํƒํ•˜๋Š” ํ™”๋ฉด์ž…๋‹ˆ๋‹ค.

์ด๋ฒˆ ์˜ˆ์ œ์—์„œ๋Š” ๋ฒ„ํŠผ ์ปจํŠธ๋กค(Button control)๋งŒ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ์„ ํƒ์€ ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค.

'Next'๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

Qt GUI Module ์„ ํƒ ํ™”๋ฉด


Base class ํ•ญ๋ชฉ์— QMainWindow / QWidget / QDialog ์„ธ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Qt GUI Application Base class


๊ฐ ํ•ญ๋ชฉ์˜ ๊ฐ„๋‹จํ•œ ์„ค๋ช…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

QMainWindow ๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, QToolBars, QDockWidgets, QMenuBar ๊ทธ๋ฆฌ๊ณ  QStatusBar๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ๋ฉ”์ธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ดํ•ดํ•˜์‹œ๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

QMainWindow Layout

QWidget ์€ ๋ชจ๋“  GUI ์š”์†Œ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ํด๋ž˜์Šค(base class)์ž…๋‹ˆ๋‹ค.

๋…๋ฆฝ์ ์ธ ์œˆ๋„์šฐ(top-level widget)๋กœ ์ƒ์„ฑ๋  ์ˆ˜๋„ ์žˆ๊ณ , ๋Œ€๋ถ€๋ถ„ ํ•˜์œ„ ์œ„์ ฏ(child widget)์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ QDialog์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์œ„์ ฏ์— button์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์•„๋ž˜์™€ ๊ฐ™์ด ์œˆ๋„์šฐ๊ฐ€ ์•„๋‹Œ Widget์€ Dialog์— ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

QWidget


QDialog ๋Š” QWidget์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์ด ํ•„์š”ํ•  ๋•Œ ๋Œ€ํ™”์ƒ์ž๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ Modal / Modeless Dialog๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.


์ฆ‰, ๋ฉ”์ธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ QMainWindow๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์ผ๋ฐ˜์ ์ธ ๋Œ€ํ™”์ƒ์ž๋Š” Dialog๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๋ณด์‹œ๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.


์œ„์™€ ๊ฐ™์ด Base class๋ฅผ QMainWindow๋กœ ์ƒ์„ฑํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํ™”๋ฉด์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

QMainWindow์œผ๋กœ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ๋œ ๋ชจ์Šต


ํŒŒ์ผ๋ช…์ด xxx.ui์ธ ํŒŒ์ผ์„ ๋”๋ธ” ํด๋ฆญํ•˜๋ฉด Qt Designer๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

Qt Designer๊ฐ€ ์‹คํ–‰๋œ ๋ชจ์Šต


์ด๊ณณ์—์„œ MFC ํ˜น์€ C#์ฒ˜๋Ÿผ UI ๋ฐฐ์น˜๋ฅผ ์ ์šฉํ•˜๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ๋กœ Push Button์„ ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ Qt Designer์—์„œ๋Š” UI Control ์ถ”๊ฐ€ ์‹œ, ์ปจํŠธ๋กค์„ ์„ ํƒํ•œ ํ›„ Drag & Drop์œผ๋กœ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Push Button์„ ์ถ”๊ฐ€ํ•œ ๋ชจ์Šต


Button์˜ ๋ณ€์ˆ˜ ์ด๋ฆ„, ํ…์ŠคํŠธ, ์ƒ‰์ƒ, ํฌ๊ธฐ ๋“ฑ์˜ ์„ค์ •์€ ์šฐ์ธก์˜ '์†์„ฑ ํŽธ์ง‘๊ธฐ'์—์„œ ์„ค์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ผ๋‹จ, ์ด๋ฒˆ ์˜ˆ์‹œ๋Š” Button Click ์ด๋ฒคํŠธ๋ฅผ ์—ฐ๋™ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์ž์„ธํ•œ ์†์„ฑ ํŽธ์ง‘์€ ๋„˜์–ด๊ฐ€๊ธฐ๋กœ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด์ œ ๋ฒ„ํŠผ์„ ์ถ”๊ฐ€ํ–ˆ์œผ๋‹ˆ ์™ผ์ชฝ ์ƒ๋‹จ์˜  ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ์ €์žฅํ•˜๊ณ , ๋‹ค์‹œ Visual Studio๋กœ ๋Œ์•„์˜ต๋‹ˆ๋‹ค.


Qt์—์„œ ์ค‘์š”ํ•œ ๊ฐœ๋…์ค‘์— ํ•˜๋‚˜๊ฐ€ Signal ๊ณผ Slot ์ž…๋‹ˆ๋‹ค.

๊ฐ‘์ž๊ธฐ ์™œ ์ด ์–˜๊ธฐ๋ฅผ ํ•˜๋ƒ๋ฉด, MFC์—์„œ ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด Message Map์— ๋ฒ„ํŠผ ๋ฆฌ์†Œ์Šค์™€ ์‹คํ–‰๋  ํ•จ์ˆ˜๊ฐ€ ON_BN_CLICKED ์— ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค.

BEGIN_MESSAGE_MAP(CMFCApplication1Dlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, &CMFCApplication1Dlg::OnBnClickedButton1) // ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ
END_MESSAGE_MAP()


Qt๋„ ๋งˆ์ฐฌ๊ฐ€์ง€ ์ž…๋‹ˆ๋‹ค.

๋ฒ„ํŠผ์ด ํด๋ฆญ๋๋‹ค๋Š” ์ด๋ฒคํŠธ(Signal) ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์—ฐ๊ฒฐ๋œ ํ•จ์ˆ˜(Slot) ๊ฐ€ ์‹คํ–‰์ด ๋˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.


์–˜๊ธฐ๊ฐ€ ๊ธธ์–ด์กŒ์Šต๋‹ˆ๋‹ค. ํ—ค๋”์— ์•„๋ž˜์™€ ๊ฐ™์ด Slot ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

#pragma once

#include <QtWidgets/QMainWindow>
#include <QMessageBox>
#include "ui_QtGuiApplication1.h"

class QtGuiApplication1 : public QMainWindow
{
	Q_OBJECT

public:
	QtGuiApplication1(QWidget *parent = Q_NULLPTR);

private:
	Ui::QtGuiApplication1Class ui;

public slots:
	void ButtonClicked();
};

๊ทธ๋ฆฌ๊ณ  ์†Œ์Šค ํŒŒ์ผ์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด connect ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ ๋ฒ„ํŠผ ์ด๋ฒคํŠธ ์—ฐ๊ฒฐ๊ณผ, ๋ฒ„ํŠผ ์ด๋ฒคํŠธ๊ฐ€ ์‹คํ–‰๋  ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ์™ธ Push Button ์ด๋ฒคํŠธ๋Š” ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”.

๋งํฌ: https://wiki.qt.io/How_to_Use_QPushButton

#include "QtGuiApplication1.h"

QtGuiApplication1::QtGuiApplication1(QWidget *parent)
	: QMainWindow(parent)
{
	ui.setupUi(this);

	connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(ButtonClicked()));
}

void QtGuiApplication1::ButtonClicked()
{
	QMessageBox::information(this, "Title", "Hello");
}


๋นŒ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Button Event ์˜ˆ์ œ ์‹คํ–‰ ํ™”๋ฉด

PushButton Example.zip


๋ฐ˜์‘ํ˜•