程序由于While循环而崩溃

时间:2019-12-03 13:25:43

标签: c++ qt

因为我正在学习Qt,所以我正在制作一个简单的桌面应用程序。 我要创建一个按钮,如果您按下该按钮,它将开始一个while循环,直到您再次按下它。

这是我的基本代码:

void TestApp::on_pushButton_3_toggled(bool checked)
{
    if (checked) {
        ui->status_label->setText("Status: Testing!");
        while (true) {
            qDebug() <<"Test";
        }
    } else {
        ui->status_label->setText("Status: Working!");
    }
}

当我按下按钮将其启用时,该程序运行正常。但是由于while循环,当我尝试禁用它时它崩溃了。

我该如何解决?

谢谢!

1 个答案:

答案 0 :(得分:6)

让我简要解释一下Qt应用程序是如何工作的。当您调用exec()QGuiApplication中的QCoreApplication时,Qt将开始其自己的主事件循环。
在该事件循环中,来自外部事件或内部事件的各种事件将排队等待处理。这将包括鼠标/键盘事件,窗口事件,信号/插槽事件等。 当您调用while(true){ ... }时,您的代码将永远不会返回Qt的事件循环,并且只会变得无响应。您可以将while(true){}解释为永远
因此,如果要在按钮为qDebug() <<"Test";的情况下运行checked,则可以通过在其上调用start(500)或在{{1}时将其停止()来启动QTimer }是错误的。
然后,您可以将该QTimerchecked信号连接到lambda函数或成员函数,以使用timeout()打印出“测试”字符串。

qDebug()

您应该在void TestApp::aFuncToCreateConnection(){ // this could be the constructor connect(ui->some_timer, &QTimer::timeout, [](){qDebug() << "Test" } ); } void TestApp::on_pushButton_3_toggled(bool checked) { if (checked) { ui->status_label->setText("Status: Testing!"); ui->some_timer->start(500); } else { ui->status_label->setText("Status: Working!"); ui->some_timer->stop(); } } 中创建一个名称为some_timer的{​​{3}}实例。 您可以了解有关Qt信号/插槽语法QTimer的更多信息。