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();