这两天在做一个需求,需要弹出窗口,并有倒计时,可以显示倒计时时间,倒计时完毕之后自动关闭窗口,然后返回默认点击是的选项,并且还可以返回窗口中人为点击是或者否的按钮,本来打算自己用ui画一个窗口,但是感觉那样比较麻烦,于是琢磨是否可以使用QMessageBox实现这个功能,网上查阅资料后,让我拼接出了一个还行的方法,直接贴代码:
bool MainWindow::widgetWithClock(QString str, int clock_s, QString btnYes, QString btnNo)
{
static QTimer timer;
if(clock_s!=-1)//-1时不计时
timer.start(1000);//1s触发一次
static int cnt=0;
cnt=clock_s;
QMessageBox *mm=new QMessageBox(QMessageBox::Information,"提醒",str,QMessageBox::Yes| QMessageBox::No,this);
mm->setButtonText(QMessageBox::Yes,btnYes); //方式1
mm->button(QMessageBox::No)->setText(btnNo); //方式2
connect(&timer,&QTimer::timeout,[=]()
{
cnt--;
mm->button(QMessageBox::No)->setText("取消("+QString::number(cnt)+")"); //方式2
if(cnt==0)
{
QAbstractButton *btn= mm->button(QMessageBox::Yes);
btn->animateClick(1);
timer.stop();
//return true;//这里不返回,经mm->exec
}
});
int ret = mm->exec();
timer.stop();//停止定时器并取消信号槽
disconnect(&timer,&QTimer::timeout,0,0);
mm->deleteLater();
if(ret == QMessageBox::Yes) return true;
else return false;
}
这个方法使用阻塞(exec)的方式让选项框卡在前面,在取消按钮上按秒刷新倒计时,倒计时完毕或点击确定,本函数返回true, 在倒计时完毕之前点击取消则函数返回false,满足我这个需求。
顺便问一下:有没有其他现成方法可以实现这个需求,并且让ui好看些?