Qt自定义messageBox弹窗,单例模式,tips/question,Qss定义样式,按钮点击返回值/信号

1.背景

        自定义messageBox弹窗,方便项目使用,单例模式避免弹出多个。

2.项目环境

        Qt 5.15.2

        Desktop Qt 5.15.2 MinGW 64-Bit

        Windows10

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.若想转载,请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值