QT 槽函数使用记录 —— 进度条弹窗事件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/theArcticOcean/article/details/78299561

在开发测评软件benchmark的过程中,有这样一个场景: 在测试窗口中选择不同的测试项,然后点击测试按钮,系统弹出新的窗口,窗口中的双进度条不断更新(单项进度条在上,总测评进度条在下)。

起初我是这样想的:在测试按钮的槽函数中先让进度条窗口show出来,然后调用进度条更新函数。简单的说就是这样:

void slotFunc(){
    progressWin->show();
    testClass->testStart();     //  testClass->testStart() calls progresswin->progressUpdate();
}

但是这样的结果是窗体弹出后,进度条不显示,同时进度条更新的函数不断发挥作用,从qt creator的log中可以看出value值不断地更新,一直到100%进度条才显示出来。
如下图所示:




然后,我设想将progresswin->progressUpdate();变成另一个信号发送,触发progressUpdate的槽函数,或者,测试按钮的click信号对应两个槽函数show(), progressUpdate()。他们的效果是一样的。
虽然一个信号可以对应多个槽函数,但是执行的次序与效果却没有保障。在读了更多关于信号和槽的工作机制后让我意识到,最好是一个信号对应一个槽函数,一个槽函数仅完成一项功能。
于是,我将方案换成这样:

void slotFunc(){
progressWin->show();

timer->setSingleShot(true);
timer->start(10);
// testStart() calls progressUpdate()
connect(timer,SIGNAL(timeout()),progressWin,SLOT(testClass->testStart());
}






在我解决这个问题后不久,我的同事提出了他的方案: 让testClass继承QThread,将testStart写入virtual void run();中,在测试按钮的click函数中调用testClass的start() ,它继承于[slot] void QThread::start(Priority priority = InheritPriority)。由此唤醒run函数线程,这算是另一种形式的触发。达到了同样的效果。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页