QEventLoop 使用用例

本文通过两个实验探讨了在Qt编程中如何在while循环中同时响应其他事件。实验1展示了未使用QEventLoop时,程序无法响应定时器事件。而实验2中引入QEventLoop后,成功实现了在循环中既执行循环体又能够处理定时器事件,如slotEventloopTest和slotTimeout的交替触发。

问题描述

在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值