如何使用QPushButton打破无限循环?

时间:2013-03-17 07:14:25

标签: qt

我有一个无限循环,在循环内部我想在每次单击按钮时插入一个状态,它将打破当前循环。 我尝试了几种方式:

if(ui->btnStop->isDown())
  {
     break;
  }


if(ui->btnStop->isChecked())
      {
         break;
      }

if(cv::waitKey(10)>=0)
{
    break;
}

但是,它不起作用。 我想知道为什么cv :: waitKey在Qt中不起作用,但在非Qt项目中它将完美地工作。 有没有其他方法可以用QPushButton打破无限循环? 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

它不起作用,因为事件处理器无法在循环中锁定执行时运行。最简单的解决方案是在每个循环中简单地调用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线程中进行长时间运行的计算吗?答案通常是否定的。