因为我正在学习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循环,当我尝试禁用它时它崩溃了。
我该如何解决?
谢谢!
答案 0 :(得分:6)
让我简要解释一下Qt应用程序是如何工作的。当您调用exec()
或QGuiApplication
中的QCoreApplication
时,Qt将开始其自己的主事件循环。
在该事件循环中,来自外部事件或内部事件的各种事件将排队等待处理。这将包括鼠标/键盘事件,窗口事件,信号/插槽事件等。
当您调用while(true){ ... }
时,您的代码将永远不会返回Qt的事件循环,并且只会变得无响应。您可以将while(true){}
解释为永远。
因此,如果要在按钮为qDebug() <<"Test";
的情况下运行checked
,则可以通过在其上调用start(500)或在{{1}时将其停止()来启动QTimer
}是错误的。
然后,您可以将该QTimer
的checked
信号连接到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
的更多信息。