6

我的程序中有一个按钮,单击它后会进行大量计算。我想在执行计算以不允许程序崩溃但我的方法不起作用的这段时间禁用它。

void MainWindow::on_pushButton_clicked()
{    
ui->pushButton->setEnabled(false);

for( ) { CALCULATION }

ui->pushButton->setEnabled(true);
}

函数setEnabled(false); 不会禁用按钮,我可以点击它多少次。

4

3 回答 3

7

您的计算是在主线程中完成的,因此您的 ui 会被阻塞,直到计算完成。计算过程中不会刷新 ui,并且您在计算结束时设置回按钮。所以在计算过程中ui没有变化。

于 2013-05-05T15:28:20.150 回答
5

这段代码的问题在于消息循环的设计。在处理一条消息(在本例中为按钮单击处理程序)时,不会处理其他消息,包括那些重新绘制小部件以反映其状态更改的消息。现在,在您的功能中,您禁用该按钮并再次启用它,然后才能对其进行更新。

请注意,对 UI 消息处理程序进行冗长的计算是个坏主意,因为它会锁定整个 UI。相反,使用异步模型(如工作线程)或使用计时器分步进行计算。然后,您还可以看到该按钮被禁用。

于 2013-05-05T15:26:56.680 回答
0

尽管上述答案对于不在 ui 处理程序上运行繁重的任务是非常正确的,因为其他 ui 处理程序将冻结我有一个我不建议使用的衬里:

void MainWindow::on_pushButton_clicked()
{    
ui->pushButton->setEnabled(false);
ui->pushButton->repaint(); 

for( ) { CALCULATION }

ui->pushButton->setEnabled(true);
}

repaint()方法强制 ui 线程在进行繁重计算之前优先重新绘制 pushButton。

现在,对于更正确的事情,您可以尝试使用 Qthread 的示例 (按钮推送示例上的 qt 线程)

于 2020-11-04T11:20:47.123 回答