[QT] QApplication

Artiper
|2025. 5. 2. 02:07

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 등)
  • 스타일, 팔레트, 폰트 등 전역 리소스 준비

 

 

 

참고 자료