我的程序中有一个按钮,点击它后做了很多计算。在执行计算时,我想禁用它,以便不允许程序崩溃,但我的方法不起作用。
void MainWindow::on_pushButton_clicked()
{
ui->pushButton->setEnabled(false);
for( ) { CALCULATION }
ui->pushButton->setEnabled(true);
}
功能 setEnabled(false); 不会按下按钮,我可以点击它多少次。
答案 0 :(得分:7)
您的计算是在主线程中完成的,因此您的ui将被阻止,直到计算完成。在计算过程中不会刷新ui,并在计算结束时放回按钮。所以在计算过程中ui没有变化。
答案 1 :(得分:4)
此代码的问题在于消息循环的设计。在处理一条消息(在这种情况下是按钮单击的处理程序)时,不会处理任何其他消息,包括重新绘制小部件以反映其状态更改的消息。现在,在您的函数中,您可以禁用该按钮并在更新之前再次启用它。
请注意,进行冗长的计算是UI消息处理程序是一个坏主意,因为它会锁定整个UI。相反,使用类似工作线程的异步模型或使用计时器逐步进行计算。然后,您还可以看到该按钮被禁用。
答案 2 :(得分:0)
尽管以上答案很正确,因为没有在ui处理程序上运行繁重的任务,因为其他ui处理程序将冻结,所以我有一个我不建议使用的衬里:
void MainWindow::on_pushButton_clicked()
{
ui->pushButton->setEnabled(false);
ui->pushButton->repaint();
for( ) { CALCULATION }
ui->pushButton->setEnabled(true);
}
repaint()
方法强制ui线程在进行大量计算之前优先重绘按钮。
现在,为了获得更正确的信息,您可以尝试使用Qthread的示例 (qt thread on button push example)