第一篇:QEventLoop 使用用例
问题描述
在while循环执行过程中同时响应其它时间。问题比较简单,记录一下实验过程。
头文件
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
public slots:
void slotTest(int n);
void slotTimeout();
signals:
void sigTest(int n);
private:
Ui::MainWindow *ui;
QTimer m_timer;
int m_nNum;
QEventLoop m_EventLoop;
};
实验1:未使用 QEventLoop
// An highlighted block
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 开启定时器
m_timer.start(100);
m_nNum = 0;
connect(this,&MainWindow::sigTest,this,&MainWindow::slotTest);
connect(&m_timer,&QTimer::timeout,this,&MainWindow::slotTimeout);
while (true)
{
Sleep(100);
qDebug() << "main ";
}
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::slotTest(int n)
{
qDebug() << "slotEventloopTest: " << n;
}
void MainWindow::slotTimeout()
{
emit sigTest(++m_nNum);
qDebug() << "slotTimeout: " << m_nNum;
}
以上程序无法响应 定时器 事件。陷入while 中。
实验2:使用 QEventLoop
while 中做如下修改:
while (true)
{
Sleep(100);
qDebug() << "main ";
m_EventLoop.exec();
}
slotTest 做修改:
void MainWindow::slotTest(int n)
{
qDebug() << "slotEventloopTest: " << n;
m_EventLoop.exit();
}
执行结果为:
main
slotEventloopTest: 1
slotTimeout: 1
main
slotEventloopTest: 2
slotTimeout: 2
main
slotEventloopTest: 3
slotTimeout: 3
main
slotEventloopTest: 4
slotTimeout: 4
本文通过两个实验探讨了在Qt编程中如何在while循环中同时响应其他事件。实验1展示了未使用QEventLoop时,程序无法响应定时器事件。而实验2中引入QEventLoop后,成功实现了在循环中既执行循环体又能够处理定时器事件,如slotEventloopTest和slotTimeout的交替触发。
4577

被折叠的 条评论
为什么被折叠?



