728x90

Qt Widget Project를 만들면 기본적으로 아래처럼 코드를 제공합니다.

#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    
    return a.exec();
}

이제 여기서 봐야할 것은 QApplication::exec() 입니다. 자세한 내용을 확인하고 싶으시면 아래 링크를 클릭해주세요.

 

QApplication Class | Qt Widgets 5.15.2

QApplication Class The QApplication class manages the GUI application's control flow and main settings. More... Header: #include qmake: QT += widgets Inherits: QGuiApplication Properties Public Functions Reimplemented Public Functions virtual bool notify(Q

doc.qt.io

QApplication::exec()를 호출하게 되면 Qt의 이벤트 루프가 시작됩니다. 이제 이벤트가 발생하게 되면 이벤트 큐에 저장이 되고 이벤트 루프는 이벤트 큐에 이벤트가 있는지 계속 확인합니다.

 

이벤트 루프가 이벤트 큐에 이벤트가 있는 것을 확인하면 QObject에게 전달 후 그에 맞는 함수들을 실행합니다.

 

만약 QPushButton의 시그널로 발생된 Slot이 처리되는데 너무 오래걸린다면 이벤트 큐에 들어있는 이벤트들을 빠르게 처리하기 어려워지게 됩니다.

 

아래의 코드를 보면 버튼을 누르면 타이머가 시작되고 타이머는 100ms마다 timeout으로 연결된 slot_timeout을 호출하게 되어 있습니다.

 

하지만 버튼의 slot 함수가 다 끝나지 않으면 다른 이벤트를 처리할 수 없기 때문에 원하는 동작을 수행할 수 없고 타이머의 slot함수는 버튼의 slot함수가 끝나자마자 무더기로 호출이 되버립니다.

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    count(0)
{
    ui->setupUi(this);
    connect(&timer,SIGNAL(timeout()),this,SLOT(slot_timeout()));
}

MainWindow::~MainWindow()
{
    timer.stop();
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    timer.start(100);
    for(count = 0 ; count < 10; count++)
    {
        qDebug() << "count = " << count;
        Sleep(100);
    }
}

void MainWindow::slot_timeout()
{
    ui->label->setText(QString::number(count));
}

이러한 문제를 해결해주기 위해서는 QThread를 사용하는 방법, processEvent를 사용하는 방법이 있습니다.

 

간단하게 QThread를 사용하는 방법은 Qt QThread 사용하기을 참고하시면 됩니다.

 

Qt QThread 사용하기(화면 실시간 갱신하기)

센서값을 수집해서 실시간으로 실행창에서 최신화하고 갱신하는 방법에 대해 소개해 드리겠습니다. 먼저 QThread를 상속받는 클래스를 하나 만들어 줍니다. 생성된 qTh.h 파일에 소스코드를 아래

1d1cblog.tistory.com

다음으로 ProcessEvent를 사용하는 방법이 있는데 QCoreApplication::processEvents()는 Qt에게 처리가 지연된 이벤트를 처리하도록 지시하는 함수입니다.

 

QCoreApplication Class | Qt Core 5.15.2

QCoreApplication Class The QCoreApplication class provides an event loop for Qt applications without UI. More... Properties Public Functions Public Slots Signals Static Public Members Reimplemented Protected Functions virtual bool event(QEvent *e) override

doc.qt.io

이 함수를 잘못 사용하면 터치 이벤트나 키 이벤트로 인해 다른 오동작을 발생할 수 있기 때문에 두 이벤트를 무시할 수 있게 플래그를 설정해주면 됩니다.

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include "windows.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    count(0)
{
    ui->setupUi(this);
    connect(&timer,SIGNAL(timeout()),this,SLOT(slot_timeout()));
}

MainWindow::~MainWindow()
{
    timer.stop();
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    timer.start(100);
    for(count = 0 ; count < 10; count++)
    {
        qDebug() << "count = " << count;
        Sleep(100);
        qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
    }
}

void MainWindow::slot_timeout()
{
    ui->label->setText(QString::number(count));
}
728x90

+ Recent posts