它不起作用,因为事件处理器在执行被锁定在循环中时无法运行。最简单的解决方案是简单地调用QApplication::processEvents()
每个循环,这将强制事件处理器运行。
// Add a boolean to your class, and a slot to set it.
MyClass
{
...
private slots:
void killLoop() { killLoopFlag_ = true; }
private:
bool killLoopFlag_;
}
// In the constructor, connect the button to the slot.
connect( ui->btnStop, SIGNAL( clicked() ),
this, SLOT( killLoop ) );
// Then when performing the loop, force events to be processed and then
// check the flag state.
killLoopFlag_ = false;
while ( true ) {
// ...Do some stuff.
QApplication::processEvents();
if ( killLoopFlag_ ) {
break;
}
}
但是您需要问自己:我是否应该在 GUI 线程中进行长时间运行的计算?答案通常是否定的。