1.背景
自定义messageBox弹窗,方便项目使用,单例模式避免弹出多个。
2.项目环境
Qt 5.15.2
Desktop Qt 5.15.2 MinGW 64-Bit
3.项目效果
4.部分代码解析
4.1单例模式
问:什么是单例模式?
答:单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。对他的理解可以配合全局变量来理解。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
//定义一个该类的全局变量
customMessageBox *customMessageBox::p_Instance = nullptr;
//用static修饰函数,返回定义的变量
static customMessageBox* instance(QWidget *parent = nullptr)
{
if (!p_Instance)
{
p_Instance = new customMessageBox(parent);
}
return p_Instance;
}
4.2设置窗口属性
setWindowFlags(QT::WindowFlags)主要设置一些窗口标志,平常开发中主要有两类需求:
1.将某一子窗口设置为最顶层窗口,比如:使用Qt::Tool属性;
2.重新定义窗口的属性,比如:取掉最大、最小、关闭等按钮,或者直接使用无边框窗口;
//产生一个无窗口边框的窗口,此时用户无法移动该窗口和改变它的大小
|
this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
|
//置顶窗口
4.3.connect+Lambda表达式
connect(ui->okBtn, &QPushButton::clicked, [=]()
{
m_SelectBtnFlag = true;
emit s_ClickModel(true);
this->accept();
});
5.代码展示
5.1customMessageBox.h
#ifndef CUSTOMMESSAGEBOX_H
#define CUSTOMMESSAGEBOX_H
#include <QDialog>
#include <QTimer>
#include <QDebug>
#include <QFile>
#include <QMessageBox>
namespace Ui {
class customMessageBox;
}
enum e_MessageBoxStatus {
messageTips = 0x00000000,
messageQuestion = 0x00000001,
};
class customMessageBox : public QDialog
{
Q_OBJECT
public:
static customMessageBox* instance(QWidget *parent = nullptr);
bool fShowMessage(const QString &message, QString btnName = "是|否", int model = 1, int timeoutMs = 3000);
signals:
void s_ClickModel(bool);
private:
explicit customMessageBox(QWidget *parent = nullptr);
~customMessageBox();
Ui::customMessageBox *ui;
static customMessageBox *p_Instance;
void fLoadQss();
QString m_CurrentMessageStr;
bool m_SelectBtnFlag;
QTimer *p_MaintainTimer;
};
#endif // CUSTOMMESSAGEBOX_H
5.2customMessageBox.cpp
#include "custommessagebox.h"
#include "ui_custommessagebox.h"
customMessageBox *customMessageBox::p_Instance = nullptr;
customMessageBox::customMessageBox(QWidget *parent) :
QDialog(parent),
ui(new Ui::customMessageBox)
{
ui->setupUi(this);
this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
fLoadQss();
m_SelectBtnFlag = true;
p_MaintainTimer = new QTimer;
connect(p_MaintainTimer, &QTimer::timeout, this, [=]()
{
this->accept();
});
connect(ui->okBtn, &QPushButton::clicked, [=]()
{
m_SelectBtnFlag = true;
emit s_ClickModel(true);
this->accept();
});
connect(ui->cancelBtn, &QPushButton::clicked, [=]()
{
m_SelectBtnFlag = false;
emit s_ClickModel(false);
this->accept();
});
}
customMessageBox::~customMessageBox()
{
delete ui;
}
/** *******************************************************************
* @Function : fLoadQss
* @Parameter : 无
* @Return : 无
* @Author : hx
* @Description : 加载样式表
******************************************************************* **/
void customMessageBox::fLoadQss()
{
QFile myFile(":/qss/customMessageStyle.qss");
if(myFile.open(QFile::ReadOnly))
{
QString winQss = QLatin1String(myFile.readAll());
this->setStyleSheet(winQss);
myFile.close();
}
}
/** *******************************************************************
* @Function : instance
* @Parameter : 无
* @Return : 无
* @Author : hx
* @Description : 单例模式,改程序只存在一个实例对象
******************************************************************* **/
customMessageBox* customMessageBox::instance(QWidget *parent)
{
if (!p_Instance)
{
p_Instance = new customMessageBox(parent);
}
return p_Instance;
}
/** *******************************************************************
* @Function : fShowMessage
* @Parameter : const QString &message 显示内容
* QString btnName 按钮内容
* int model 显示模式,tips或者question
* int timeoutMs 持续时间
* @Return : 无
* @Author : hx
* @Description : 显示函数
******************************************************************* **/
bool customMessageBox::fShowMessage(const QString &message, QString btnName, int model, int timeoutMs)
{
p_MaintainTimer->stop();
if(btnName.contains('|'))
{
QStringList tempList = btnName.split('|');
ui->okBtn->setText(tempList.at(0));
ui->cancelBtn->setText(tempList.at(1));
}
else
ui->okBtn->setText(btnName);
ui->messageLabel->setText(message);
m_CurrentMessageStr = message;
if(model == messageTips)
{
ui->okBtn->show();
ui->cancelBtn->hide();
ui->horizontalSpacer_6->changeSize(0,0);
QPixmap pix(":/pic/tips_2.png");
ui->iconLabel->setPixmap(pix.scaled(QSize(50,50),Qt::KeepAspectRatio));
p_MaintainTimer->start(timeoutMs);
}
else if(model == messageQuestion)
{
ui->okBtn->show();
ui->cancelBtn->show();
ui->horizontalSpacer_6->changeSize(60,20);
QPixmap pix(":/pic/tips_1.png");
ui->iconLabel->setPixmap(pix.scaled(QSize(50,50),Qt::KeepAspectRatio));
}
exec();
return m_SelectBtnFlag;
}
5.3customMessageBox.ui
6.Demo下载
文中所涉及的源工程代码块已上传,请有需要移步下载,在pro文件中加入customMessageBox.pri即可使用
https://download.csdn.net/download/m0_56573550/89730238
以上程序可能存在纰漏,实现功能也不尽完善。期待和大家一起学习交流,共同进步。
注意:1.若有侵权,请联系删除。
2.若想转载,请注明出处。