QApplication
QApplication은 signal-slot을 작동시키는 이벤트 루프를 실행한다. 실행중인 이벤트 루프가 없으면 GUI 컴포넌트에서 발생하는 이벤트는 전혀 전파되지 않으므로 UI는 아무일도 하지 않게 된다.
해당 메인 이벤트 루프는 다음과 같은 것들을 처리한다:
- 사용자 데스크톱 설정 초기화 (예: 폰트, 팔레트, 더블 클릭 간격)
- 이벤트
- 마우스, 키보드, 새로고침
- 기존 창 시스템에서 이벤트를 수신하여 관련 위젯으로 전송하는 이벤트 처리
- sendEvent(), postEvent()를 사용하여 자체 이벤트를 위젯에 전달 가능
- 커맨드 라인 매개변수 처리
- 스타일 관리. QStyle 객체에 캡슐화되며 런타임에 setStyle()을 사용하여 변경 가능
- translate()를 통해 문자열 현지화
- clipboar() 객체 제공
- signal-slot
- widgetAt()을 사용하여 특정 위치에 어떤 위젯이 존재하는지, topLevelWidgets() 및 closeAllWindows() 등을 사용하여 목록 가져오기
- 일종의 비동기 또는 이벤트 핸들링(GUI, OS) 필요한 대부분의 QT 기능들
QApplication이 없다면 QT 코드를 순차적으로만 실행할 수 있다. 즉, Qt 타이머나 OS, User Interaction등이 없다. 울론 이런 상태는 유닛 테스트에선 때때로 필요할 수도 있다. 이러한 메인 스레드의 이벤트 루프는 `QApplication.exec()를 호출하자마자 시작하며 사용자가 모든 윈도우를 닫거나 QCoreApplication.quit() 호출 시 이벤트 루프가 종료된다. QApplication은 QCoreApplication에서 파생되었으므로 quit() 메소드는 차이가 없다.
int main(int argc, char *argv[]) {
// Q[Core|Gui|)Application
QCoreApplication app(argc, argv);
// 중요한 설정(예: 최소 구성 파일, GUI 등)을 로드
// 이 단계에서는 이벤트, 타이머 및 신호 슬롯이 작동하지 않음
QSettings settings(...);
// QApplication 시작
// 애플리케이션이 닫히면 반환(강제 또는 사용자에 의해).
return app.exec();
}
일반적으로 QApplication을 처음 만들게 되는데, 필요에 따라 어플리케이션의 정적 부분을 초기화한다음 qApp() -> exec()을 호출하여 메인 이벤트 루프를 실행한다. 세팅하는 단계에서는 시그널이나 타이머가 동작하지 않고, exec()가 실행해서 이벤트 루프가 실행해야 동작한다.
QApplication의 인스턴스
QT를 사용하는 모든 GUI 프로그램에는 윈도우가 몇개가 존재하던 딱 하나의 QApplication 객체가 존재한다. 어플리케이션에는 단 하나의 QApplication만 존재해야하고, 지역 변수 또는 전역 qApp 포인터를 통해 제어할 수 있다.
올바른 QApplication 선택하기
어플리케이션 종류에 따라 불필요항 종속성을 피하기 위해 다른 클래스가 필요할수도 있다. 일부 GUI 어플리케이션은 특수한 batch mode를 사용하기에 non-GUI에서는 불필요한 리소스를 초기화 할 필요도 없다.
- non-GUI application: QCoreApplication
- QT Quick 기반 그래픽 어플리케이션(QML 어플리케이션): QGuiApplication
- QtWidgets 라이브러 기반 그래픽 어플리케이션: QApplication
주의 사항
QApplication 선언하지 않고, QPushButton과 같은 변수 선언하면 오류 생김
- QApplication은 어플리케이션의 이벤트 루프, 전역 리소스, GUI 시스템을 초기화함
- GUI 백엔드 초기화 (X11, Windows API, Cocoa 등)
- 스타일, 팔레트, 폰트 등 전역 리소스 준비
참고 자료
- https://stackoverflow.com/questions/8026101/correct-way-to-quit-a-qt-program
- https://stackoverflow.com/questions/5770017/qt-what-is-qapplication-simply?utm_source=chatgpt.com
- https://doc.qt.io/qt-6/qapplication.html
- https://doc.qt.io/qt-6/qapplication.html#details
'QT' 카테고리의 다른 글
| [Qt] CMakePresets.json, CMakeUserPresets.json (0) | 2025.08.20 |
|---|---|
| [QT] QOpenGLShaderProgram의 addShaderFromSourceCode 메서드 (0) | 2025.05.18 |
| [QT] CMake로 환경 설정 (0) | 2025.04.30 |
| [QT6] windeployqt를 통한 환경 exe 파일 구동 설정 (0) | 2025.04.17 |