如何禁用QPushButton?

6

我的程序中有一个按钮,点击后会进行大量的计算。我想在这些计算进行时禁用该按钮,以防止程序崩溃,但是我的方法没有奏效。

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

for( ) { CALCULATION }

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

在IT技术中,使用setEnabled(false);函数不能禁用推动按钮,我可以随意点击它。


setEnabled() 必须正常工作。 - Blood
3个回答

7

您的计算在主线程中完成,因此UI将被阻塞,直到计算完成。 计算期间,UI不会刷新,并且您会在计算结束时重新设置按钮。 因此,在计算期间,UI没有任何变化。


我如何在计算开始之前强制更新它? - kawing-chiu

5
这段代码的问题在于消息循环的设计。在处理一个消息时(在这种情况下是按钮点击处理程序),不会处理其他任何消息,包括重新绘制小部件以反映其状态更改的消息。现在,在您的函数中,您在按钮更新之前禁用并重新启用了它。
请注意,在UI消息处理程序中执行长时间计算是个坏主意,因为它会锁定整个UI。相反,使用异步模型,如工作线程或使用定时器分步进行计算。然后,您还可以看到按钮被禁用的情况。

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 thread on button push example)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接