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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM