728x90
반응형

Qt의 이벤트 루프(Event Loop)

Qt의 이벤트 루프(event loop)는 GUI 애플리케이션에서 중요한 역할을 하는 구조로, 프로그램이 사용자 입력(예: 마우스 클릭, 키보드 입력) 및 기타 이벤트(예: 타이머, 네트워크 이벤트 등)를 지속적으로 처리하고 응답할 수 있게 합니다. 이벤트 루프는 애플리케이션이 실행되는 동안 계속해서 돌아가면서 이벤트 큐(Event Queue)에서 이벤트를 가져와 적절한 이벤트 핸들러로 전달하는 역할을 합니다.

Qt 이벤트 루프의 주요 구성 요소

  1. QCoreApplication/QGuiApplication/QApplication:

    • QCoreApplication은 모든 Qt 애플리케이션의 기본 클래스입니다.
    • QGuiApplication은 GUI 기능을 사용하는 애플리케이션을 위한 클래스입니다.
    • QApplication은 위의 두 클래스를 모두 포함하는 가장 일반적인 클래스입니다.
  2. exec() 메서드:

    • exec() 메서드를 호출하면 이벤트 루프가 시작됩니다. 이 메서드는 애플리케이션이 종료될 때까지 반환하지 않습니다.
   int main(int argc, char *argv[]) {
       QApplication app(argc, argv);
       MainWindow window;
       window.show();
       return app.exec();  // 이벤트 루프 시작
   }
  1. 이벤트 큐:

    • Qt의 이벤트 루프는 이벤트 큐를 사용하여 들어오는 모든 이벤트를 관리합니다. 이벤트는 큐에 추가된 순서대로 처리됩니다.
  2. 이벤트 처리:

    • 각 이벤트는 관련된 객체와 연결된 이벤트 핸들러에 의해 처리됩니다. Qt는 다양한 이벤트 타입(e.g., QMouseEvent, QKeyEvent)과 해당 이벤트를 처리하기 위한 핸들러 메서드를 제공합니다.

이벤트 루프의 동작 방식

  1. 이벤트 큐에 이벤트 추가:

    • 사용자 입력, 타이머, 네트워크 등의 이벤트가 발생하면 이벤트 큐에 추가됩니다.
  2. 이벤트 처리:

    • 이벤트 루프는 큐에서 이벤트를 하나씩 가져와서 적절한 객체로 전달합니다.
    • 전달된 이벤트는 해당 객체의 이벤트 핸들러 메서드에 의해 처리됩니다. 예를 들어, 마우스 클릭 이벤트는 QWidget의 mousePressEvent(QMouseEvent *event) 메서드에서 처리될 수 있습니다.
  3. 이벤트 루프의 지속적 실행:

    • 이벤트 루프는 exec() 메서드가 호출된 이후 계속해서 실행되며, 큐에 이벤트가 남아 있는 한 이를 처리합니다.
    • 애플리케이션이 종료될 때까지 이벤트 루프는 멈추지 않습니다. 종료 요청이 들어오면 quit() 메서드가 호출되어 이벤트 루프가 종료됩니다.

예제 코드

#include <QApplication>
#include <QWidget>
#include <QPushButton>

class MyWidget : public QWidget {
public:
    MyWidget() {
        QPushButton *button = new QPushButton("Click me", this);
        connect(button, &QPushButton::clicked, this, &MyWidget::handleButtonClick);
    }

private slots:
    void handleButtonClick() {
        // 버튼 클릭 이벤트 처리
        qDebug("Button was clicked!");
    }
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    MyWidget window;
    window.show();
    return app.exec();  // 이벤트 루프 시작
}

  • 이 예제에서는 버튼 클릭 이벤트를 처리하는 간단한 Qt 애플리케이션을 보여줍니다. app.exec()가 호출되면 이벤트 루프가 시작되어 버튼 클릭과 같은 이벤트를 처리합니다.
728x90
반응형

+ Recent posts