Qt 프로그래밍 시작하기 Qt Widgets
이 주제에서는 C++과 Qt Widgets 모듈을 사용하여 간단한 메모장 애플리케이션을 구현함으로써 기본적인 Qt 지식을 다룹니다. 이 애플리케이션은 텍스트 파일을 생성하고, 저장하고, 인쇄하거나 다시 열어 편집할 수 있는 작은 텍스트 편집기입니다. 또한 사용할 글꼴을 설정할 수도 있습니다.

예제 실행
다음 경로에서 예제를 실행할 수 있습니다.
- Qt Creator
Welcome 모드를 열고 Examples 에서 예제를 선택하십시오. 자세한 내용은 Qt Creator: 튜토리얼: 빌드 및 실행을 참조하십시오.
- Qt Extension for Visual Studio Code
Command Palette 에서 Qt: Open Qt examples 명령을 실행하고 목록에서 예제를 선택합니다. 자세한 내용은 Qt Extension for Visual Studio Code: 튜토리얼: 빌드 및 실행을 참조하십시오.
메모장 프로젝트 만들기
Qt Creator 에서 새 프로젝트를 설정할 때는 프로젝트 생성 과정을 단계별로 안내하는 마법사가 도움을 줍니다. 이 마법사는 해당 프로젝트 유형에 필요한 설정을 입력하도록 안내하고, 프로젝트를 자동으로 생성해 줍니다.
참고: Qt Creator 의UI 텍스트와 생성된 파일의 내용은 사용 중인 Qt Creator 버전에 따라 다릅니다.

메모장 프로젝트를 생성하려면 ‘ File ’ > ‘ New Project ’ > ‘ Application (Qt) ’ > Qt Widgets Application > Choose 을 선택하고 마법사의 지침을 따르십시오. Class Information 대화 상자에서 클래스 이름으로 Notepad를 입력하고 기본 클래스로 QMainWindow 를 선택하십시오.

이 Qt Widgets Application 마법사는 메인 소스 파일과 사용자 인터페이스(Notepad 위젯)를 정의하는 일련의 파일을 포함하는 프로젝트를 생성합니다:
- CMakeLists.txt - 프로젝트 파일입니다.
- main.cpp - 애플리케이션의 메인 소스 파일입니다.
- notepad.cpp - Notepad 위젯의 notepad 클래스 소스 파일.
- notepad.h - Notepad 위젯의 notepad 클래스 헤더 파일.
- notepad.ui - Notepad 위젯의 UI 폼입니다.
이 파일들에는 프로젝트를 빌드하고 실행하는 데 필요한 기본 코드가 포함되어 있습니다. 다음 섹션에서 파일 내용을 자세히 살펴보겠습니다.
자세히 알아보기
| 정보 | 여기 |
|---|---|
| 사용법 Qt Creator | Qt Creator |
| 다른 종류의 애플리케이션 만들기 Qt Creator | Qt Creator 튜토리얼 |
메인 소스 파일
마법사는 main.cpp 파일에 다음과 같은 코드를 생성합니다:
#include "notepad.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Notepad w;
w.show();
return a.exec();
}코드를 한 줄씩 살펴보겠습니다. 다음 줄들은 Notepad 위젯과 ` QApplication`에 대한 헤더 파일을 포함합니다. 모든 Qt 클래스에는 해당 클래스 이름을 딴 헤더 파일이 있습니다.
#include "notepad.h"
#include <QApplication>다음 줄은 모든 C 및 C++ 기반 애플리케이션의 진입점인 main 함수를 정의합니다:
int main(int argc, char *argv[])다음 줄은 ` QApplication ` 객체를 생성합니다. 이 객체는 애플리케이션 전체의 리소스를 관리하며, ` Qt Widgets`을 사용하는 모든 Qt 프로그램을 실행하는 데 필수적입니다. 이 객체는 ` argv`에서 실행된 ` argc ` 명령줄 인수를 사용하여 애플리케이션 객체를 생성합니다. (` Qt Widgets`을 사용하지 않는 GUI 애플리케이션의 경우, 대신 ` QGuiApplication `을 사용할 수 있습니다.)
QApplication a(argc, argv);다음 줄은 Notepad 객체를 생성합니다. 이 객체는 마법사가 클래스와 UI 파일을 생성한 대상입니다. 사용자 인터페이스에는 Qt에서 ‘ widgets ’이라고 불리는 시각적 요소들이 포함되어 있습니다. 위젯의 예로는 텍스트 편집 상자, 스크롤 막대, 레이블, 라디오 버튼 등이 있습니다. 위젯은 다른 위젯을 담는 컨테이너 역할도 할 수 있습니다. 예를 들어 대화 상자나 메인 애플리케이션 창이 이에 해당합니다.
Notepad w;다음 코드는 Notepad 위젯을 별도의 창으로 화면에 표시합니다. 위젯은 컨테이너 역할도 할 수 있습니다. 대표적인 예로, 종종 여러 종류의 위젯을 포함하는 QMainWindow 가 있습니다. 위젯은 기본적으로 보이지 않으며, show() 함수를 호출하여 위젯을 표시합니다.
w.show();다음 코드는 QApplication 가 이벤트 루프에 진입하도록 합니다. Qt 애플리케이션이 실행 중일 때 이벤트가 생성되어 애플리케이션의 위젯으로 전송됩니다. 이벤트의 예로는 마우스 클릭이나 키 입력이 있습니다.
return a.exec();자세히 알아보기
| 정보 | 여기 |
|---|---|
| 위젯 및 창 기하 구조 | 창 및 대화 상자 위젯 |
| 이벤트 및 이벤트 처리 | 이벤트 시스템 |
UI 설계
마법사는 XML 형식의 사용자 인터페이스 정의 파일인 notepad.ui를 생성합니다. Qt Creator 에서 notepad.ui 파일을 열면, 통합된 Qt Widgets Designer 가 자동으로 열립니다.
애플리케이션을 빌드하면 Qt Creator 가 Qt User Interface Compiler (uic) 를 실행하여 .ui 파일을 읽고, 이에 해당하는 C++ 헤더 파일인 ui_notepad.h를 생성합니다.
사용법 Qt Widgets Designer
이 마법사는 QMainWindow 을 사용하는 애플리케이션을 생성합니다. 이 애플리케이션에는 메뉴 바, 도킹 위젯, 툴바 및 상태 표시줄을 추가할 수 있는 고유한 레이아웃이 있습니다. 중앙 영역에는 어떤 종류의 위젯이든 배치할 수 있습니다. 마법사는 이 영역에 메모장(Notepad) 위젯을 배치합니다.
Qt Widgets Designer 에 위젯을 추가하려면:
- Qt Creator Edit 모드에서, ‘ Projects ’ 뷰에 있는 notepad.ui 파일을 더블클릭하여 통합 개발 환경( Qt Widgets Designer)에서 파일을 실행합니다.
- 위젯 Text Edit(QTextEdit)를 폼으로 드래그 앤 드롭합니다.
- Ctrl+A (또는 Cmd+A) 를 눌러 위젯을 선택한 다음, Lay out Vertically (또는 Ctrl+L)을 클릭하여 세로 레이아웃(QVBoxLayout)을 적용합니다.
- Ctrl+S (또는 Cmd+S)를 눌러 변경 사항을 저장합니다.
이제 Qt Widgets Designer 에서 UI는 다음과 같이 표시됩니다:

코드 편집기에서 생성된 XML 파일을 확인할 수 있습니다:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Notepad</class>
<widget class="QMainWindow" name="Notepad">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>400</height>
</rect>
</property>
<property name="windowTitle">
<string>Notepad</string>
</property>
<widget class="QWidget" name="centralWidget">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTextEdit" name="textEdit"/>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menuBar">
...다음 줄에는 문서에서 사용되는 XML 버전과 문자 인코딩을 지정하는 XML 선언이 포함되어 있습니다:
<?xml version="1.0" encoding="UTF-8"?>파일의 나머지 부분은 Notepad 위젯을 정의하는 ui 요소를 지정합니다:
<ui version="4.0">이 UI 파일은 Notepad 클래스의 헤더 파일 및 소스 파일과 함께 사용됩니다. UI 파일의 나머지 부분은 후속 섹션에서 살펴보겠습니다.
Notepad 헤더 파일
마법사는 Notepad 클래스에 대한 헤더 파일을 생성했으며, 이 파일에는 필요한 #include 문, 생성자, 소멸자 및 Ui 객체가 포함되어 있습니다. 파일 내용은 다음과 같습니다:
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui {
class Notepad;
}
QT_END_NAMESPACE
class Notepad : public QMainWindow
{
Q_OBJECT
public:
explicit Notepad(QWidget *parent = nullptr);
~Notepad();
private:
Ui::Notepad *ui;
QString currentFile;
};다음 줄은 메인 애플리케이션 창을 제공하는 QMainWindow 를 포함합니다:
#include <QMainWindow>다음 줄은 uic 를 포함시켜 메인 애플리케이션 창을 제공합니다:
namespace Ui {
class Notepad;
}클래스 선언에는 Q_OBJECT 매크로가 포함되어 있습니다. 이 매크로는 클래스 정의에서 가장 먼저 와야 하며, 해당 클래스를 QObject 로 선언합니다. 당연히 QObject 를 상속받아야 합니다. QObject 는 일반 C++ 클래스에 여러 가지 기능을 추가합니다. 특히, 클래스 이름과 슬롯 이름은 런타임에 조회할 수 있습니다. 또한 슬롯의 매개변수 유형을 조회하고 슬롯을 호출하는 것도 가능합니다.
class Notepad : public QMainWindow
{
Q_OBJECT다음 코드 줄은 ` parent`라는 기본 인자를 갖는 생성자를 선언합니다. 값 0은 해당 위젯에 부모가 없음을 나타냅니다(즉, 최상위 위젯입니다).
public:
explicit Notepad(QWidget *parent = nullptr);다음 코드는 객체의 수명 주기 동안 확보된 리소스를 해제하기 위한 가상 소멸자를 선언합니다. C++ 명명 규칙에 따르면, 소멸자는 관련 클래스와 동일한 이름을 가지며, 이름 앞에 물결표(~)가 붙습니다. ` QObject`에서 소멸자는 가상 소멸자로 선언되어, 기저 클래스 포인터를 통해 객체가 삭제될 때 파생 클래스의 소멸자가 올바르게 호출되도록 보장합니다.
~Notepad();다음 코드 줄들은 Notepad UI 클래스를 가리키는 포인터인 멤버 변수를 선언합니다. 멤버 변수는 특정 클래스와 연관되어 있으며, 해당 클래스의 모든 메서드에서 접근할 수 있습니다.
private:
Ui::Notepad *ui;
QString currentFile;
};Notepad 소스 파일
마법사가 Notepad 클래스에 대해 생성한 소스 파일은 다음과 같습니다.
#include "notepad.h"
#include "ui_notepad.h"
Notepad::Notepad(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Notepad)
{
ui->setupUi(this);
}다음 코드 줄은 마법사에 의해 생성된 Notepad 클래스 헤더 파일과 uic 도구에 의해 생성된 UI 헤더 파일을 포함합니다:
#include "notepad.h"
#include "ui_notepad.h"다음 줄은 ` Notepad `의 생성자를 정의합니다:
Notepad::Notepad(QWidget *parent) :다음 줄은 Notepad 클래스의 기저 클래스인 QMainWindow 의 생성자를 호출합니다:
QMainWindow(parent),다음 줄은 UI 클래스 인스턴스를 생성하고 이를 ` ui ` 멤버에 할당합니다:
ui(new Ui::Notepad)다음 코드는 UI를 설정합니다:
{
ui->setupUi(this);소멸자에서 ui 를 삭제합니다:
Notepad::~Notepad()
{
delete ui;
}프로젝트 파일
마법사는 다음과 같은 프로젝트 파일인 ` CMakeLists.txt`을 생성합니다:
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
cmake_minimum_required(VERSION 3.16)
project(notepad LANGUAGES CXX)
find_package(Qt6
REQUIRED COMPONENTS Core Gui Widgets
OPTIONAL_COMPONENTS PrintSupport
)
qt_standard_project_setup()
qt_add_executable(notepad
main.cpp
notepad.cpp notepad.h notepad.ui
)
set_target_properties(notepad PROPERTIES
WIN32_EXECUTABLE TRUE
MACOSX_BUNDLE TRUE
)
target_link_libraries(notepad PRIVATE
Qt6::Core
Qt6::Gui
Qt6::Widgets
)
if(TARGET Qt6::PrintSupport)
target_link_libraries(notepad PRIVATE Qt6::PrintSupport)
endif()
# Resources:
set(notepad_resource_files
"images/bold.png"
"images/copy.png"
"images/create.png"
"images/cut.png"
"images/edit_redo.png"
"images/edit_undo.png"
"images/exit.png"
"images/font.png"
"images/info.png"
"images/italic.png"
"images/new.png"
"images/open.png"
"images/paste.png"
"images/pencil.png"
"images/print.png"
"images/save.png"
"images/save_as.png"
"images/underline.png"
)
qt_add_resources(notepad "notepad"
PREFIX
"/"
FILES
${notepad_resource_files}
)
install(TARGETS notepad
BUNDLE DESTINATION .
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
qt_generate_deploy_app_script(
TARGET notepad
OUTPUT_SCRIPT deploy_script
NO_UNSUPPORTED_PLATFORM_ERROR
)
install(SCRIPT ${deploy_script})이 프로젝트 파일에는 프로젝트에 포함된 소스, 헤더 및 UI 파일이 명시되어 있습니다.
자세히 알아보기
| 정보 | 여기 |
|---|---|
| 사용 방법 Qt Widgets Designer | Qt Widgets Designer 사용 설명서 |
| 레이아웃 | 레이아웃 관리, 위젯 및 레이아웃, 레이아웃 예제 |
| Qt Widgets에 포함된 위젯 | Qt Widgets 갤러리 |
| 메인 창 및 메인 창 클래스 | 애플리케이션 메인 윈도우, 메인 윈도우 예제 |
| QObject 및 Qt 객체 모델 (이는 Qt를 이해하는 데 필수적입니다) | 객체 모델 |
| qmake와 Qt 빌드 시스템 | qmake 매뉴얼 |
사용자 상호작용 추가
에디터에 기능을 추가하려면, 먼저 툴바에 메뉴 항목과 버튼을 추가하는 것부터 시작합니다.
"Type Here"를 클릭하고 New, Open, Save, Save as, Print 및 Exit 옵션을 추가합니다. 그러면 아래의 Action Editor에 5줄이 생성됩니다. 액션을 슬롯에 연결하려면 액션을 마우스 오른쪽 버튼으로 클릭하고 Go to slot > triggered() 을 선택한 다음, 해당 슬롯의 코드를 완성합니다.
이 액션들을 툴바에도 추가하려면, 각 QAction 에 아이콘을 할당한 다음, QAction 을 툴바로 드래그하면 됩니다. 아이콘을 할당하려면 해당 액션의 Icon 속성에 아이콘 이름을 입력하면 됩니다. QAction 을 툴바로 드래그한 후, 아이콘을 클릭하면 연결된 슬롯이 실행됩니다.
newDocument() 메서드를 완성하세요:
void Notepad::newDocument()
{
currentFile.clear();
ui->textEdit->setText(QString());
}currentFile 변수는 현재 편집 중인 파일을 포함하는 전역 변수이며, clear() 는 텍스트 버퍼를 지웁니다. currentFile 변수는 notepad.h 파일의 비공개(private) 부분에 정의되어 있습니다:
private:
Ui::Notepad *ui;
QString currentFile;파일 열기
notepad.ui 에서 actionOpen 을 마우스 오른쪽 버튼으로 클릭하고 Go to Slot 을 선택합니다.
open() 메서드를 완성합니다.
void Notepad::open()
{
QString fileName = QFileDialog::getOpenFileName(this, "Open the file");
if (fileName.isEmpty())
return;
QFile file(fileName);
currentFile = fileName;
if (!file.open(QIODevice::ReadOnly | QFile::Text)) {
QMessageBox::warning(this, "Warning", "Cannot open file: " + file.errorString());
return;
}
setWindowTitle(fileName);
QTextStream in(&file);
QString text = in.readAll();
ui->textEdit->setText(text);
file.close();
}QFileDialog::getOpenFileName 파일을 선택할 수 있는 대화 상자가 열립니다. ` QFile ` 객체 ` myfile `는 선택된 ` file_name `를 매개변수로 받습니다. 나중에 사용할 수 있도록 선택된 파일을 전역 변수 ` currentFile `에도 저장합니다. ` file.open `를 읽기 전용 텍스트 파일로 열어줍니다. 파일을 열 수 없는 경우 경고가 표시되고 프로그램이 중지됩니다.
매개변수 ` myfile`에 대한 ` QTextStream ` instream 을 정의합니다. 파일 ` myfile `의 내용이 ` QString ` text 으로 복사됩니다. ` setText(text) `는 편집기의 버퍼를 ` text`로 채웁니다.
파일 저장
파일 열기와 동일한 방식으로 파일 저장 메서드를 생성합니다. 즉, actionSave 을 마우스 오른쪽 버튼으로 클릭하고 ‘ Go to Slot ’을 선택합니다.
void Notepad::save()
{
QString fileName;
// If we don't have a filename from before, get one.
if (currentFile.isEmpty()) {
fileName = QFileDialog::getSaveFileName(this, "Save");
if (fileName.isEmpty())
return;
currentFile = fileName;
} else {
fileName = currentFile;
}
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly | QFile::Text)) {
QMessageBox::warning(this, "Warning", "Cannot save file: " + file.errorString());
return;
}
setWindowTitle(fileName);
QTextStream out(&file);
QString text = ui->textEdit->toPlainText();
out << text;
file.close();
}QFile myfile 객체는 우리가 작업하던 파일을 포함하는 전역 변수 와 연결되어 있습니다. 를 열 수 없는 경우, 오류 메시지가 표시되고 메서드가 중단됩니다. 를 생성합니다. 편집기 버퍼의 내용은 일반 텍스트로 변환된 후 에 기록됩니다. current_file myfile QTextStream outstream outstream
다른 이름으로 파일 저장하기
void Notepad::saveAs()
{
QString fileName = QFileDialog::getSaveFileName(this, "Save as");
if (fileName.isEmpty())
return;
QFile file(fileName);
if (!file.open(QFile::WriteOnly | QFile::Text)) {
QMessageBox::warning(this, "Warning", "Cannot save file: " + file.errorString());
return;
}
currentFile = fileName;
setWindowTitle(fileName);
QTextStream out(&file);
QString text = ui->textEdit->toPlainText();
out << text;
file.close();
}이 절차는 파일을 저장하는 방법과 동일하며, 유일한 차이점은 여기서 생성할 파일에 대한 새로운 파일 이름을 입력해야 한다는 점입니다.
파일 인쇄
인쇄 기능을 사용하려면 프로젝트 파일에 ` PrintSupport `를 추가해야 합니다:
find_package(Qt6
REQUIRED COMPONENTS Core Gui Widgets
OPTIONAL_COMPONENTS PrintSupport
)notepad.cpp 에서 printDev 라는 QPrinter 객체를 선언합니다:
void Notepad::print()
{
#if defined(QT_PRINTSUPPORT_LIB) && QT_CONFIG(printer)
QPrinter printDev;
#if QT_CONFIG(printdialog)
QPrintDialog dialog(&printDev, this);
if (dialog.exec() == QDialog::Rejected)
return;
#endif // QT_CONFIG(printdialog)
ui->textEdit->print(&printDev);
#endif // QT_CONFIG(printer)
}프린터 대화 상자를 표시하고, 선택된 프린터를 printDev 객체에 저장합니다. Cancel 을 클릭했지만 프린터를 선택하지 않은 경우, 메서드는 반환됩니다. 실제 프린터 명령은 QPrinter 객체를 매개변수로 전달하여 ui->textEdit->print 를 호출하여 실행합니다.
글꼴 선택
void Notepad::selectFont()
{
bool fontSelected;
QFont font = QFontDialog::getFont(&fontSelected, this);
if (fontSelected)
ui->textEdit->setFont(font);
}QFontDialog 를 통해 글꼴을 선택했는지 여부를 나타내는 부울 변수를 선언합니다. 선택한 경우, ui->textEdit->setFont(myfont) 를 통해 글꼴을 설정합니다.
복사, 잘라내기, 붙여넣기, 실행 취소, 다시 실행
텍스트를 선택하여 클립보드에 복사하려면 ui->textEdit 의 적절한 메서드를 호출합니다. 잘라내기, 붙여넣기, 실행 취소 및 다시 실행도 마찬가지입니다.
이 표는 사용해야 할 메서드 이름을 보여줍니다.
| 작업 | 호출되는 메서드 |
|---|---|
| 복사 | ui->textEdit->copy() |
| 잘라내기 | ui->textEdit->cut() |
| 붙여넣기 | ui->textEdit->붙여넣기() |
| 실행 취소 | ui->textEdit->undo() |
| 다시 실행 | ui->textEdit->redo() |
자세히 알아보기
| 소개 | 여기 |
|---|---|
| 파일 및 I/O 장치 | QFile, QIODevice |
| tr() 및 국제화 | Qt Linguist 매뉴얼, 번역을 위한 소스 코드 작성, Qt를 이용한 국제화 |
명령줄에서 빌드 및 실행
명령줄에서 예제 애플리케이션을 빌드하려면 해당 애플리케이션을 위한 빌드 디렉터리를 생성하십시오. 빌드 디렉터리로 이동한 후 ` qt-cmake ` 명령을 실행하여 프로젝트를 빌드할 수 있도록 구성하십시오. 프로젝트 구성이 성공적으로 완료되면, 생성된 파일을 통해 프로젝트를 빌드할 수 있습니다.
md <build_directory>
cd <build_directory>
<qt_installation_directory>\bin\qt-cmake -GNinja <source_directory>
<generator>이 명령어들은 빌드 디렉터리에 실행 파일을 생성합니다. ` CMake ` 도구는 프로젝트 파일을 읽고 애플리케이션을 빌드하는 방법에 대한 지침을 생성합니다. 그런 다음 생성기는 이 지침을 사용하여 실행 가능한 바이너리를 생성합니다.
예를 들어, Ninja를 생성기로 사용하여 Windows에서 Notepad 예제를 빌드하려면 다음 명령을 입력하십시오:
md notepad-build
cd notepad-build
C:\Qt\6.12.0\msvc2022_64\bin\qt-cmake -GNinja C:\Examples\notepad
ninjaNinja를 생성기로 사용하지 않는 경우, ` ninja` 대신 생성기에 구애받지 않는 CMake 명령을 사용하여 애플리케이션을 빌드하십시오:
cmake --build© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.