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::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 사용하기을 참고하시면 됩니다.
다음으로 ProcessEvent를 사용하는 방법이 있는데 QCoreApplication::processEvents()는 Qt에게 처리가 지연된 이벤트를 처리하도록 지시하는 함수입니다.
이 함수를 잘못 사용하면 터치 이벤트나 키 이벤트로 인해 다른 오동작을 발생할 수 있기 때문에 두 이벤트를 무시할 수 있게 플래그를 설정해주면 됩니다.
#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));
}
'Programming > Qt' 카테고리의 다른 글
Qt 데이터 시각화 도구 QCustomPlot 사용하기(1) (2) | 2021.02.17 |
---|---|
Qt 위젯 캡처하는 법 (0) | 2021.02.16 |
Qt 비슷한 파일명을 가진 파일 정보 불러오기 (0) | 2020.12.09 |
Qt QDir path static 함수 (0) | 2020.12.09 |
Qt QFileDialog 사용하기 (0) | 2020.12.08 |