在我的Qt应用程序中,我有一个按钮来启动一个需要大约10秒完成的工作。我注意到在单击按钮后的10s期间,如果我再次单击按钮区域,它仍然被视为单击,并且一旦从第一次单击结束,作业将再次启动。
这是预期的吗?如果第一次点击的作业结束,我该怎么做才能避免点击按钮?感谢。
答案 0 :(得分:3)
我会禁用该按钮,直到作业完成并添加标签(或GIF动画)以指示"正在进行的工作"。这对用户来说更好,因为他看到按钮被禁用 - >即他有一个"反馈"来自你的系统。然后当过程结束时,你发出一个"完成"信号Signals and Slots,连接到" enableButtons"插槽 - >即完成该过程后,您将重新按下该按钮。
void Process(){
ui->yourButton->setEnabled(false);
/* Maybe play loading gif animation etc*/
/* Do your work here */
emit ProcessFinished();
}
答案 1 :(得分:0)
您可以使用“setEnabled”和setDisabled“方法在作业完成时停用按钮,然后添加回调以在作业完成时激活按钮。
在此处阅读setEnabled的文档:http://doc.qt.io/qt-5/qwidget.html#enabled-prop
答案 2 :(得分:0)
尝试这样,但我认为setEnabled(bool)也应该正常工作
static bool s = true;
void Window::onButtonClickedSlot()
{
if(s){
s = false;
//process start
//process end
s = true;
}else{
QMessageBox::Information(this, "button does not work","There is a process" , QMessageBox::Ok );
}
}
答案 3 :(得分:0)
在尝试之后,我认为“QCoreApplication :: processEvents()”可以解决问题。以下是我发现的内容,也是该主题的结论:
=========================
void MainWindow::on_pushButton_2_clicked()
{
QDateTime dateTime;
qDebug()<<"Btn2-Time#1:"<<dateTime.currentDateTime().toString("[yyyyMMdd hh:mm:ss] ");
QThread::sleep(10);
qDebug()<<"Btn2-Time#2:"<<dateTime.currentDateTime().toString("[yyyyMMdd hh:mm:ss] ");
}
最初我的代码就像上面一样,当我点击按钮并在10s睡眠时间再次点击时,我得到了这个,并注意第一次运行结束后第二次运行立即开始。
Btn2-Time#1: "[20170731 16:07:39] "
Btn2-Time#2: "[20170731 16:07:49] "
Btn2-Time#1: "[20170731 16:07:49] "
Btn2-Time#2: "[20170731 16:07:59] "
=========================
void MainWindow::on_pushButton_clicked()
{
QDateTime dateTime;
ui->pushButton->setEnabled(false);
qDebug()<<"Btn1-Time#1:"<<dateTime.currentDateTime().toString("[yyyyMMdd hh:mm:ss] ");
QThread::sleep(10);
qDebug()<<"Btn1-Time#2:"<<dateTime.currentDateTime().toString("[yyyyMMdd hh:mm:ss] ");
QCoreApplication::processEvents();
ui->pushButton->setEnabled(true);
}
根据其中一条评论,我添加了disable和QCoreApplication :: processEvents();如上所述,现在相同的操作不会触发第二次运行,因为在重置按钮之前处理了第二次点击以启用。
Btn1-Time#1: "[20170731 16:07:24] "
Btn1-Time#2: "[20170731 16:07:34] "
=========================
void MainWindow::on_pushButton_3_clicked()
{
QDateTime dateTime;
ui->pushButton_3->setEnabled(false);
qDebug()<<"Btn3-Time#1:"<<dateTime.currentDateTime().toString("[yyyyMMdd hh:mm:ss] ");;
QThread::sleep(10);
qDebug()<<"Btn3-Time#2:"<<dateTime.currentDateTime().toString("[yyyyMMdd hh:mm:ss] ");
//QCoreApplication::processEvents();
ui->pushButton_3->setEnabled(true);
}
注释掉QCoreApplication :: processEvents();,它将第二次点击处理为原始,因此只是禁用该按钮不是解决方案,而QCoreApplication :: processEvents();诀窍!
Btn3-Time#1: "[20170731 16:08:00] "
Btn3-Time#2: "[20170731 16:08:10] "
Btn3-Time#1: "[20170731 16:08:10] "
Btn3-Time#2: "[20170731 16:08:20] "
=========================
谢谢!