Qt自定义提示弹窗
Qt自定义提示弹窗
目录
Qt自定义提示弹窗
1.添加文件
MessageBox.h
MessageBox.cpp
最后添加 MessageBox.ui 文件
2.调用头文件添加代码cpp文件添加代码
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();
作者:jixiang
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)