1

我有一个无限循环,在循环内我想在单击按钮时插入一个状态,它会中断当前循环。我尝试了几种方法,例如:

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


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

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

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

4

1 回答 1

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 线程中进行长时间运行的计算?答案通常是否定的。

于 2013-03-17T07:59:09.013 回答