Qt Framework를 사용할 때 개발툴로 Qt Creator를 사용하는데 이것을 대신하여 Jetbrains사의 C++ 개발 환경인 CLion을 이용하여 윈도 위젯을 만들 수 있다.

Qt는 기본으로 제공하며 여기에 CMakeLists.txt를 수정하여 개발 환경을 구축한다. 프로젝트를 생성하고 빌드하면 cmake 설정 에러가 날 수 있는데 cmake 파일을 수정하기 않아서이다.

graph LR
A["New Project"] --> B["Qt Widgets Excutable"]
B --> C["CMakeLists.txt"]
C --> D["Qt UI Class"]

추가로 프로그램 아이콘(타이틀바, 실행파일)을 설정한다.

CMakeLists.txt 툴체인 샘플
set(QT_ROOT_PATH "C:/Qt/6.8.3")  
set(MSYS2_UCRT_PATH "C:/msys64/ucrt64")

if (MSVC)
    set(CMAKE_PREFIX_PATH "${QT_ROOT_PATH}/msvc2022_64")
elseif (EXISTS "${MSYS2_UCRT_PATH}")
    list(APPEND CMAKE_PREFIX_PATH "${MSYS2_UCRT_PATH}")
    set(CMAKE_FIND_ROOT_PATH "${MSYS2_UCRT_PATH}")
else ()
    set(CMAKE_PREFIX_PATH "${QT_ROOT_PATH}/mingw_64")
endif ()

개발환경 : CLion 2025.3.4, Qt 6.8.3, 툴체인 MinGW/Visual Sutio

CMakeLists.txt 기본설정
cmake_minimum_required(VERSION 4.1)  
project(qtproject)  
  
set(QT_ROOT_PATH "C:/Qt/6.8.3")  
  
if (MSVC)  
    set(CMAKE_PREFIX_PATH "${QT_ROOT_PATH}/msvc2022_64")  
else ()  
    set(CMAKE_PREFIX_PATH "${QT_ROOT_PATH}/mingw_64")  
endif ()  
  
set(CMAKE_CXX_STANDARD 20)  
set(CMAKE_AUTOMOC ON)  
set(CMAKE_AUTORCC ON)  
set(CMAKE_AUTOUIC ON)  
  
find_package(Qt6 COMPONENTS Core Gui Widgets REQUIRED)  
  
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)  
  
set(CMAKE_AUTOUIC_SEARCH_PATHS  
        ${CMAKE_SOURCE_DIR}/ui  
        ${CMAKE_SOURCE_DIR}/src  
)  
  
add_executable(${PROJECT_NAME} main.cpp resources.qrc app.rc  
        src/mainwindow.cpp  
        include/mainwindow.h  
        ui/mainwindow.ui)  
  
target_include_directories(${PROJECT_NAME} PRIVATE  
        include  
        ${CMAKE_BINARY_DIR}  
)  
  
target_link_libraries(${PROJECT_NAME} Qt::Core Qt::Gui Qt::Widgets)
CMakeLists.txt 빌드 환경설정

위의 코드에 아래의 코드를 더하여 빌드 환경을 구축한다. 각 빌드 기본 폴더 안의 deploy 폴더에 배포 시 필요한 최소화된 파일들이 생성된다. MinGW, MSVC 같이 적용한 파일이다.

if (WIN32 AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)  
    set_target_properties(${PROJECT_NAME} PROPERTIES WIN32_EXECUTABLE ON)  
  
    if (TARGET Qt6::qmake)  
        get_target_property(_qmake_executable Qt6::qmake IMPORTED_LOCATION)  
        get_filename_component(_qt_bin_dir "${_qmake_executable}" DIRECTORY)  
        find_program(WINDEPLOYQT_EXECUTABLE windeployqt HINTS "${_qt_bin_dir}")  
    endif ()  
  
    if (WINDEPLOYQT_EXECUTABLE)  
  
        set(DEPLOY_DIR "${CMAKE_BINARY_DIR}/deploy")  
  
        if (MSVC AND CMAKE_BUILD_TYPE STREQUAL "Debug")  
            set(DEPLOY_MODE "--debug")  
        else ()  
            set(DEPLOY_MODE "--release")  
        endif ()  
  
        set(MINIMIZE_FLAGS  
                "--no-translations"  
                "--no-opengl-sw"
                "--no-system-d3d-compiler"
                "--no-svg"
                "--no-quick-import"
                "--no-sql"
                "--no-network"
        )  
  
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD  
                COMMAND "${WINDEPLOYQT_EXECUTABLE}"  
                ${DEPLOY_MODE}  
                --compiler-runtime  
                --no-translations  
                --verbose 0  
                "$<TARGET_FILE:${PROJECT_NAME}>"  
  
                COMMAND ${CMAKE_COMMAND} -E rm -rf "${DEPLOY_DIR}"  
                COMMAND ${CMAKE_COMMAND} -E make_directory "${DEPLOY_DIR}"  
  
                COMMAND ${CMAKE_COMMAND} -E copy  
                "$<TARGET_FILE:${PROJECT_NAME}>"  
                "${DEPLOY_DIR}/"  
  
                COMMAND "${WINDEPLOYQT_EXECUTABLE}"  
                ${DEPLOY_MODE}  
                --compiler-runtime  
                ${MINIMIZE_FLAGS}  
                --verbose 1  
                "${DEPLOY_DIR}/$<TARGET_FILE_NAME:${PROJECT_NAME}>"  
  
                COMMENT "build 실행 환경, deploy 최소 DLL 구성 완료"  
        )  
    endif ()  
endif ()
프로그램 아이콘 설정

cmake 파일의 add_executable 부분에 넣어준다. 예제에는 포함하였다.

  • app.rc
IDI_ICON1 ICON "main.ico"
  • resources.qrc
<RCC>  
    <qresource prefix="/">  
        <file>main.ico</file>  
    </qresource>
</RCC>
main.cpp
#include "mainwindow.h"
#include <QApplication>
#include <QScreen>
#include <QDebug>

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);

    qDebug() << "현재 기기 픽셀 비율:" <<
            a.devicePixelRatio();
    qDebug() << "적용된 라운딩 정책:" <<
            QGuiApplication::highDpiScaleFactorRoundingPolicy();

    MainWindow m;
    m.show();
    return QApplication::exec();
}
mainwindow.h
#ifndef QTPROJECT_MAINWINDOW_H  
#define QTPROJECT_MAINWINDOW_H  
  
#include <QMainWindow>  
  
QT_BEGIN_NAMESPACE  
  
namespace Ui {  
    class MainWindow;  
}  
  
QT_END_NAMESPACE  
  
class MainWindow : public QMainWindow {  
    Q_OBJECT  
  
public:  
    explicit MainWindow(QWidget *parent = nullptr);  
  
    ~MainWindow() override;  
  
private:  
    Ui::MainWindow *ui;  
};  
  
#endif //QTPROJECT_MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"  
#include "ui_mainwindow.h" 
  
MainWindow::MainWindow(QWidget *parent)  
    : QMainWindow(parent), ui(new Ui::MainWindow) {  
    ui->setupUi(this);  
}  
  
MainWindow::~MainWindow() {  
    delete ui;  
}

main.cpp를 제외한 소스코드는 src,inclue,ui 폴더로 이동하여 작성한다. 코드 작성 후 reset cache and Reload project를 실행하여 설정이 꼬인 부분을 해결한다.

참고로 UI 파일을 클릭하면 Qt 설치 시 제공된 디자이너가 실행된다.

msys64/ucrt64 QT예제
cmake_minimum_required(VERSION 4.2)
project(msys2_qt)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_PREFIX_PATH "C:/msys64/ucrt64")

find_package(Qt6 REQUIRED COMPONENTS Core Sql)
find_package(SQLite3 REQUIRED)

add_executable(${PROJECT_NAME}
        main.cpp
        db_raii.h
)

target_link_libraries(${PROJECT_NAME} PRIVATE
        Qt6::Core
        Qt6::Sql
        SQLite::SQLite3
)

CMakeLists.txt 전체 내용 및 예제는 GitHub에서 확인할 수 있다.