如何避免在Qt中单击按钮两次

时间:2017-07-31 07:22:01

标签: qt button

在我的Qt应用程序中,我有一个按钮来启动一个需要大约10秒完成的工作。我注意到在单击按钮后的10s期间,如果我再次单击按钮区域,它仍然被视为单击,并且一旦从第一次单击结束,作业将再次启动。

这是预期的吗?如果第一次点击的作业结束,我该怎么做才能避免点击按钮?感谢。

4 个答案:

答案 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] "

=========================

谢谢!