Qt自定义提示弹窗

1.添加文件

MessageBox.h

#ifndef CMESSAGEBOX_H
#define CMESSAGEBOX_H

#include <QDialog>
#include <QWidget>
#include <QToolButton>
#include <QLabel>
#include <QEventLoop>
#include <QDebug>

#include "Include/titlebar.h"

//关闭按钮大小
const int iCloseButtonSize = 12;
//标题栏高度
const int iHeightTitleBarMessageBox = 30;

namespace Ui {
    class CMessageBox;
}

class CMessageBox : public QDialog
{
    Q_OBJECT
public:
    enum Result
    {
        Yes = 1,//yes按钮
        No,//no按钮
        Cancel//取消按钮
    };

public:
    CMessageBox(const char* pchTitle, const char* pchText, int ButtonNum = 1, QWidget *parent = 0);
    ~CMessageBox();

public:
    //添加标题栏
    void addTitleBar(QString strTitle = "Dialog");
    //获取标题栏高度
    int GetTitleBarHeight();

    int Exec(QPoint point);
    int exec();
public slots:
    void onClickYes();
    void onClickNo();
    void onClickCancel();

protected:
    //窗口大小改变
    void resizeEvent(QResizeEvent *event);
    void closeEvent(QCloseEvent * event);
private:
    //背景图片
    //QPixmap m_pixmapBackgroud;
    //标题栏
    titlebar* m_pTitleBarQMessageBox;

private:
    Ui::CMessageBox *ui_MessageBox;

    int m_iChooseResult;

    QEventLoop * m_eventLoop;
};

#endif // MESSAGEBOX_H

MessageBox.cpp

#include "MessageBox.h"
#include "ui_MessageBox.h"

#include <QApplication>
#include <QMouseEvent>
#include <QPainter>
#include <QHBoxLayout>

/*******************************************************************
    Function:        // CBaseDialog()
    Description:     // 构造函数,初始化数据,加载背景图片
    Input:           // QWidget *parent:父窗口
    Output:          // 无
    Return:          //  
*******************************************************************/
CMessageBox::CMessageBox(const char* pchTitle, const char* pchText, int ButtonNum, QWidget *parent)
    : QDialog(parent),
    ui_MessageBox(new Ui::CMessageBox),
    m_pTitleBarQMessageBox(NULL)
{
    ui_MessageBox->setupUi(this);

    //应用样式 apply the qss style
    QFile file(":/qss/qss/MessageBox.qss");
    file.open(QFile::ReadOnly);
    QTextStream filetext(&file);
    QString stylesheet = filetext.readAll();
    this->setStyleSheet(stylesheet);
    file.close();

//    QFile file(":/qss/qss/MessageBox.qss");
//    if(file.open(QIODevice::ReadOnly | QIODevice::Text))
//    {
//        qApp->setStyleSheet(file.readAll());
//        file.close();
//    }

    titlebar::TitleInfo l_titleInfo;
    l_titleInfo.m_FontSize = 22;
    l_titleInfo.m_bkcolor = QColor(255, 255, 255);
    l_titleInfo.m_Height = 46;
    l_titleInfo.m_bmaxNeed = false;
    l_titleInfo.m_Textcolor = QColor(255, 255, 255);
    l_titleInfo.m_bminNeed = false;
    l_titleInfo.m_bcloseNeed = true;

    m_pTitleBarQMessageBox = new titlebar(nullptr, Qt::Dialog);
    l_titleInfo.m_strTitle = QStringLiteral("提示");
    m_pTitleBarQMessageBox->SetTitleBarInfo(this, &l_titleInfo);
    m_pTitleBarQMessageBox->setFixedSize(440, 250);
    m_pTitleBarQMessageBox->show();

    //去除标题栏
//    setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::FramelessWindowHint);
//    setModal(true);

    QString l_strTitle = QString::fromLocal8Bit(pchTitle);
    addTitleBar(l_strTitle);

//    QString l_strText = QString::fromLocal8Bit(pchText);
    ui_MessageBox->label->setText(pchText);
//    ui_MessageBox->label->setReadOnly(true);

    QPalette l_palette;
    l_palette.setBrush(QPalette::Background, QBrush(QColor("#1687d3")));
    this->setPalette(l_palette);

    //设置界面样式
//    this->setStyleSheet("QToolButton{background-color:#000000;border:1px solid #1687d3;} ");
//    ui_MessageBox->pushButton_OK->setStyleSheet("QPushButton{border-image:url(:/ico/image/QPushButton_default.png;)"
//                                                "border:1px; "
//                                                "border-radius:4px;"
//                                                "color:#ffffff;"
//                                                "font-size:18px; } \
//                                         QPushButton::hover{border-image:url(:/ico/image/QPushButton_suspension.png);} \
//                                         QPushButton::pressed{border-image:url(:/ico/image/QPushButton_press.png);} \
//                                         ");
//    ui_MessageBox->pushButtonNo->setStyleSheet("QPushButton{background-color:#fafafa;"
//                                               "border:1px solid #b7b6b6; "
//                                               "border-radius:4px;"
//                                               "color:#131313;"
//                                               "font-size:10px; } \
//                                            QPushButton::hover{background-color: #e8e8e8; } \
//                                         QPushButton::pressed{background-color:#dadada;} \
//                                         ");
//    ui_MessageBox->pushButton_Cancel->setStyleSheet("QPushButton{background-color:#fafafa;"
//                                                    "border:1px solid #b7b6b6; "
//                                                    "border-radius:4px;"
//                                                    "color:#131313;"
//                                                    "font-size:10px; } \
//                                            QPushButton::hover{background-color: #e8e8e8; } \
//                                         QPushButton::pressed{background-color:#dadada;} \
//                                         ");
//    ui_MessageBox->widget->setStyleSheet("background-color:rgba(166,202,235,45%)");
//    ui_MessageBox->textEdit->setStyleSheet("QTextEdit{color:#131313; font-size:14px; border:none;}");

    QFont l_font("Microsoft YaHei",12);
//    m_pTitleBar->setFont(l_font);
    ui_MessageBox->label->setFont(l_font);
//    ui_MessageBox->label_Text->setTextFormat(Qt::PlainText);
//    ui_MessageBox->label_Text->adjustSize();
//    ui_MessageBox->label_Text->setGeometry(QRect(10, 10, 290, 27*4));
//    ui_MessageBox->label_Text->setWordWrap(true);
//    ui_MessageBox->label_Text->setAlignment(Qt::AlignTop);
    ui_MessageBox->pushButton_OK->setFont(l_font);
    ui_MessageBox->pushButton_Cancel->setFont(l_font);
        /*QRect l_rect = this->geometry();*/
    this->setGeometry(750, 480, 415, 141);

    if (1 == ButtonNum)
    {        
        ui_MessageBox->pushButton_OK->setGeometry(ui_MessageBox->pushButton_Cancel->geometry());
        ui_MessageBox->pushButton_Cancel->hide();
        ui_MessageBox->pushButtonNo->hide();
        connect(ui_MessageBox->pushButton_OK, SIGNAL(clicked()), this, SLOT(onClickYes()));
    }
    else if (2 == ButtonNum)
    {
        ui_MessageBox->pushButtonNo->hide();
        //connect(ui->pushButton_OK, SIGNAL(clicked()), this, SLOT(accept()));
        //connect(ui->pushButton_Cancel, SIGNAL(clicked()), this, SLOT(reject()));

        connect(ui_MessageBox->pushButton_OK, SIGNAL(clicked()), this, SLOT(onClickYes()));
        connect(ui_MessageBox->pushButton_Cancel, SIGNAL(clicked()), this, SLOT(onClickNo()));

        ui_MessageBox->pushButton_OK->setGeometry(ui_MessageBox->pushButton_OK->geometry().x() + 30, ui_MessageBox->pushButton_OK->geometry().y(),
            ui_MessageBox->pushButton_OK->geometry().width(), ui_MessageBox->pushButton_OK->geometry().height());

        ui_MessageBox->pushButton_Cancel->setGeometry(ui_MessageBox->pushButton_Cancel->geometry().x() - 10, ui_MessageBox->pushButton_Cancel->geometry().y(),
            ui_MessageBox->pushButton_Cancel->geometry().width(), ui_MessageBox->pushButton_Cancel->geometry().height());

    }
    else if (3 == ButtonNum)
    {
        ui_MessageBox->pushButton_OK->setText(QString::fromLocal8Bit("是"));
        connect(ui_MessageBox->pushButton_OK, SIGNAL(clicked()), this, SLOT(onClickYes()));
        connect(ui_MessageBox->pushButtonNo, SIGNAL(clicked()), this, SLOT(onClickNo()));
        connect(ui_MessageBox->pushButton_Cancel, SIGNAL(clicked()), this, SLOT(onClickCancel()));
    }
}

CMessageBox::~CMessageBox()
{
    delete ui_MessageBox;
}

/*******************************************************************
    Function:        // addTitleBar()
    Description:     // 添加标题栏,并将当前窗口上的所有控件向下移动
                     // 移动距离为标题栏的高度
    Input:           // QString strTitle:标题栏的标题名称
    Output:          // 无
    Return:          // void
*******************************************************************/
void CMessageBox::addTitleBar(QString strTitle /*= "Dialog"*/)
{
    //窗口宽度
    int l_iWidth = this->size().width();
    //窗口高度
    int l_iHeight = this->size().height();
    if (NULL == m_pTitleBarQMessageBox)
    {
        m_pTitleBarQMessageBox = new titlebar(this);

        //将该窗口高度增加标题栏的高度
        this->resize(l_iWidth, l_iHeight + iHeightTitleBarMessageBox);

        m_pTitleBarQMessageBox->show();
    }
}


/*******************************************************************
    Function:        // GetTitleBarHeight()
    Description:     // 获取标题栏高度
    Input:           // 无
    Output:          // 无
    Return:          // int  标题栏高度
*******************************************************************/
int CMessageBox::GetTitleBarHeight()
{
    return iHeightTitleBarMessageBox;
}


int CMessageBox::Exec(QPoint point)
{
    //调整位置
    QSize l_size = this->size();
    this->setGeometry(point.x(), point.y(), l_size.width(), l_size.height());

    return QDialog::exec();
}
/*******************************************************************
Function:        // exec()
Description:     // 重写exec方法
Input:           // 无
Output:          // 无
Return:          // 
*******************************************************************/
int CMessageBox::exec()
{
    //设置为模态
    this->setWindowModality(Qt::ApplicationModal);

    show();
    //使用事件循环QEventLoop,不让exec()方法结束,在用户选择确定或者取消后,关闭窗口
    //结束事件循环,并返回最后用户选择的结果
    //根据返回结果得到用户按下了确定还是取消,采取相应的操作。从而模拟出QDialog类的
    //exec()方法
    m_eventLoop =   new QEventLoop(this);
    m_eventLoop->exec();

    return m_iChooseResult;
}
/*******************************************************************
Function:        // onClickYes
Description:     // 是按钮对应的槽函数
Input:           // 无
Output:          // 无
Return:          //
*******************************************************************/
void CMessageBox::onClickYes()
{
    m_iChooseResult = Yes;
    close();
    m_pTitleBarQMessageBox->slot_close();
}
/*******************************************************************
Function:        // onClickNo()
Description:     // 否按钮对应的槽函数
Input:           // 无
Output:          // 无
Return:          //
*******************************************************************/
void CMessageBox::onClickNo()
{
    m_iChooseResult = No;
    close();
    m_pTitleBarQMessageBox->slot_close();
}

/*******************************************************************
Function:        // onClickCancel
Description:     // 取消按钮对应的槽函数
Input:           // 无
Output:          // 无
Return:          //
*******************************************************************/
void CMessageBox::onClickCancel()
{
    m_iChooseResult = Cancel;
    close();
    m_pTitleBarQMessageBox->slot_close();
}

/*******************************************************************
    Function:        // resizeEvent()
    Description:     // 若窗口添加了标题栏,则窗口大小改变时,改变标题栏大小
    Input:           // QResizeEvent *event:改变窗口大小事件
    Output:          // 无
    Return:          // void
*******************************************************************/
void CMessageBox::resizeEvent(QResizeEvent *event)
{
    QDialog::resizeEvent(event);

    if (m_pTitleBarQMessageBox)
    {
        int l_iWidth = event->size().width();
        m_pTitleBarQMessageBox->resize(l_iWidth, iHeightTitleBarMessageBox);
    }
}
/*******************************************************************
Function:        // closeEvent()
Description:     // 窗口关闭事件
Input:           // QCloseEvent *event:窗口关闭事件
Output:          // 无
Return:          // void
*******************************************************************/
void CMessageBox::closeEvent(QCloseEvent * event)
{
    //关闭窗口时结束事件循环,在exec()方法中返回选择结果
    if (m_eventLoop != NULL)
    {
        m_eventLoop->exit();
    }

//    m_pTitleBarQMessageBox->slot_close();
    event->accept();
}

最后添加 MessageBox.ui 文件

2.调用

头文件添加代码

CMessageBox *m_MessageBox;

cpp文件添加代码

CMessageBox *l_messagBox = new CMessageBox("提示","请选中分类后添加",1,this);
l_messagBox->exec();

原文链接

Qt自定义提示弹窗-QT开发中文网Qt自定义提示弹窗https://qt.0voice.com/?id=963

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值