Qt_MsgBox 非常简单 自定义实现类似QMessageBox的弹窗 静态调用

1.简述

经常需要定制弹窗,win10自带的与项目风格不符合。比如UI给的下图
Qt_MsgBox 非常简单 自定义实现类似QMessageBox的弹窗 静态调用_第1张图片
之前一直用的实现方式
一个QWidget当背景,一个QLabel显示文本,再放俩按钮,定义俩信号。点完delete掉。

太蠢了,好多都是用QMessgaeBox显示弹窗,而且使用静态调用特别方便。
设置样式表可以达到上图效果。但是大小不能调,太小了。resize()和 setFixsize()都无效。遂放弃。
寻找新的办法。

2.思路

实现一个静态方法,传入需要显示的文本即可。因为一个项目背景风格都一致。就文本不同
用.exec()这样调用,可以阻塞按钮按下再退出。
Qt_MsgBox 非常简单 自定义实现类似QMessageBox的弹窗 静态调用_第2张图片
怎么设定.exec()的返回值来区分点了那个按钮呢?
继承QDialog,在点击确定键的时候调用done(0); 那么QDialog.exec()的返回值就是0,这样就能识别按钮了。 不同的按钮返回不同的值就行了。
Qt_MsgBox 非常简单 自定义实现类似QMessageBox的弹窗 静态调用_第3张图片

3.代码

使用方法

int ret = CMsgBox::showMsgBox("确认删除?",NULL);
if(ret ==  CMsgBox::ENM_OK_BTN){
    qDebug()<<"OK Key! ";
}
代码实现

CMsgBox.cpp

#include "CMsgBox.h"
#include 
#include 

CMsgBox::CMsgBox(QWidget *parent)
    :QDialog(parent)
{
    m_strImgPath = QApplication::applicationDirPath() + "/UI/image/homepage/";
    init();
}

int CMsgBox::showMsgBox(QString strText, QWidget *parent)
{
    CMsgBox msgBox(parent);
    msgBox.m_pLabel->setText(strText);
    return msgBox.exec();
}

void CMsgBox::init()
{
    this->setFixedSize(533,279);
    this->setStyleSheet("color:rgb(57,193,230);");
    this->setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog); //隐藏标题栏
    this->setWindowModality(Qt::ApplicationModal); //窗口模态

    QWidget *pWidget = new QWidget(this);
    pWidget->resize(this->size());
    pWidget->setStyleSheet("border-image:url(" + m_strImgPath + "popWindow/bg_window_delete.png)");

    QGridLayout *pGLayout = new QGridLayout;
    pGLayout->setSpacing(20);


    m_pLabel = new QLabel(this);
    m_pLabel->setFixedSize(400,40);
    m_pLabel->setAlignment(Qt::AlignCenter);
    m_pLabel->setText(m_strText);
    m_pLabel->setStyleSheet("font-size:22px;");


    QPushButton *pBtnConfirm = new QPushButton(this);
    pBtnConfirm->setFixedSize(111,46);
    pBtnConfirm->setStyleSheet("QPushButton{border-image:url(" + m_strImgPath + "popWindow/btn_ok_n.png)}"
                             "QPushButton:pressed{border-image:url(" + m_strImgPath + "popWindow/btn_ok_c.png)}");
    connect(pBtnConfirm,&QPushButton::clicked,[=]{
       done(ENM_OK_BTN);
    });

    QPushButton *pBtnCancle = new QPushButton(this);
    pBtnCancle->setFixedSize(111,46);
    pBtnCancle->setStyleSheet("QPushButton{border-image:url(" + m_strImgPath + "popWindow/btn_cancel_n.png)}"
                                                                               "QPushButton:pressed{border-image:url(" + m_strImgPath + "popWindow/btn_cancel_c.png)}");
    connect(pBtnCancle,&QPushButton::clicked,[=]{
        done(ENM_CANCEL_BTN);
    });

    pGLayout->addWidget(m_pLabel,0,0,1,2,Qt::AlignCenter);
    pGLayout->addWidget(pBtnConfirm,1,1,1,1);
    pGLayout->addWidget(pBtnCancle,1,0,1,1);
    pGLayout->setRowMinimumHeight(2,50);
    this->setLayout(pGLayout);
}


CMsgBox.h

#ifndef CMSGBOX_H
#define CMSGBOX_H

#include 
#include 
#include 
#include 


class CMsgBox : public QDialog
{
    Q_OBJECT
public:
    explicit CMsgBox(QWidget *parent = nullptr);

    static int showMsgBox(QString strText,QWidget *parent = nullptr);

private:
    void init();
public:
    enum EnmButton{
        ENM_OK_BTN = 0,
        ENM_CANCEL_BTN,
    };

private:
    QString m_strImgPath = "";
    QString m_strText = "";

    QLabel *m_pLabel = nullptr;
};

#endif // CMSGBOX_H


你可能感兴趣的:(Qt)