在实际开发中,我们会有这样一种需求,一个提示框,用户可以手动关闭,或者在用户没有操作的情况下,显示3秒钟然后自动关闭,这样应该怎样做呢?
我们的思路应该是这样的:
1.对话框构造函数里,设置一个定时器
2.定时器槽函数设置为close()
看代码
.h
#ifndef SUBMITSCOREERRORDLG_H
#define SUBMITSCOREERRORDLG_H
#include <QDialog>
#include <QTimer>
enum TipsType
{
TipsType_Unknown = 0,
TipsType_Warnning = 1,//警告
TipsType_Ok = 2//成功
};
namespace Ui {
class TipsDlg;
}
class TipsDlg : public QDialog
{
Q_OBJECT
public:
explicit TipsDlg(TipsType type, const QString &msg, QWidget *parent = 0);
~TipsDlg();
void startTimer();
private:
/**
* @brief initFrame 初始化对话框
* @param msg 提示信息
*/
void initFrame(const QString &msg);
private:
Ui::TipsDlg *ui;
TipsType m_type;
QTimer *m_pTimer;
};
.cpp
#include "tipsdlg.h"
#include "ui_tipsdlg.h"
TipsDlg::TipsDlg(TipsType type, const QString &msg, QWidget *parent) :
QDialog(parent),
ui(new Ui::TipsDlg),
m_type(type)
{
ui->setupUi(this);
setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::WindowStaysOnTopHint);
setAttribute(Qt::WA_TranslucentBackground);
initFrame(msg);
m_pTimer = new QTimer(this);
m_pTimer->setSingleShot(true);
connect(m_pTimer, &QTimer::timeout, this, [=](){this->close();});
}
TipsDlg::~TipsDlg()
{
if(m_pTimer != Q_NULLPTR)
m_pTimer->deleteLater();
delete ui;
}
void TipsDlg::startTimer()
{
m_pTimer->start(3000);
}
void TipsDlg::initFrame(const QString &msg)
{
if(TipsType_Warnning == m_type)//警告
{
ui->iconLabel->setStyleSheet("QLabel{background-image: url(:/qc/warnning);background-repeat:no-repeat;}");
}
else if(TipsType_Ok == m_type)//成功
{
ui->iconLabel->setStyleSheet("QLabel{background-image: url(:/qc/tips_ok);background-repeat:no-repeat;}");
}
ui->tipsLabel->setText(msg);
}
怎么调用呢?
TipsDlg dlg(TipsType_Ok, "提交评分成功", this->topLevelWidget());
dlg.setAttribute(Qt::WA_ShowModal, true);
dlg.startTimer();
dlg.exec();