Qt 实现带阴影的QMessagebox

在实际项目里面使用到了QMessageBox做一个弹窗,最开始是样式不是需要的样式,就去找了一下QMessageBox的样式表,一般来说可以使用findChild()来找到这个控件中的一切子控件,Qt的许多控件都是由一些其他的控件组合在一起。
下面这个函数是来自博主公孙二狗

void MainWidget::dumpStructure(const QObject *obj, int spaceCount) {qDebug() << QString("%1%2 : %3").arg("", spaceCount).arg(obj->metaObject()->className()).arg(obj->objectName());QObjectList list = obj->children();foreach (QObject * child, list) {dumpStructure(child, spaceCount + 4);}
}

就是一个递归函数,来一直遍历子控件的内容,下面是输出的结果

"QMessageBox : "
"    QLabel : qt_msgboxex_icon_label"
"    QGridLayout : "
"    QLabel : qt_msgbox_label"
"    QDialogButtonBox : qt_msgbox_buttonbox"
"        QHBoxLayout : "

这表明,QMessageBox里面有QLable -> qt_msgboxex_icon_label这个是指框里的图标、QLabel -> qt_msgbox_label这个就是里面文字,QDialogButtonBox -> qt_msgbox_buttonbox这个就是按钮,例如下图:

下图是我设置的样式表,这样式表部分参考自QSS 自定义QMessageBox

/* =============================================== */
/* QMessageBox                                     */
/* =============================================== */
/*设置背景*/QMessageBox
{background-color: rgba(51, 153, 251, 1);border-radius: 3px;width: 240px;height: 180px;
} /*设置QMessageBox的文字内容*/
QMessageBox QLabel#qt_msgbox_label { /* textLabel */color: rgba(255, 255, 255, 1);background-color: transparent;min-width: 240px; /* textLabel设置最小宽度可以相应的改变QMessageBox的最小宽度 */min-height: 80px; /* textLabel和iconLabel高度保持一致 */
}/*设置图标*/
QMessageBox QLabel#qt_msgboxex_icon_label { /* iconLabel */width: 80px;height: 80px; /* textLabel和iconLabel高度保持一致 */
}/*设置按钮样式*/
QMessageBox QPushButton
{background-color: rgba(51, 153, 251, 1);width: 50px;height: 20px;color: rgba(0, 0, 0, 1);font: 10pt "Microsoft YaHei";border-style: inset;border-color: rgba(0, 74, 169, 1);border-width: 1;
}

这是效果图:

但是你会发现一个问题,就是这个对话框的标题的背景什么的并不可以修改,这个标题栏的样式是跟随系统的。所以这个时候就需要自己实现一个对话框来解决这些问题。下面是我设计的对话框,参考了大佬一去二三里的博客。

#ifndef SHADOWMESSAGEBOX_H
#define SHADOWMESSAGEBOX_H#include <QWidget>
#include <QLabel>
#include <QIcon>
#include <QHBoxLayout>
#include <QPushButton>
#include <QGraphicsDropShadowEffect>
#include "titlebar.h"class ShadowMessageBox : public QWidget
{Q_OBJECT
public:enum Icon {// keep this in sync with QMessageDialogOptions::IconNoIcon = 0,Information = 1,Warning = 2,Critical = 3,Question = 4};ShadowMessageBox(QWidget * parent);ShadowMessageBox(QWidget * parent, const QString &title, const QString &text, ShadowMessageBox::Icon icon=Information);static void information(QWidget * parent, const QString &title, const QString &text);static void critical(QWidget * parent, const QString &title, const QString &text);private:QWidget * m_widg;TitleBar * m_pTitleBar;QVBoxLayout *m_pLayout;QLabel * m_msgIcon;QLabel * m_msgText;QHBoxLayout * m_hlabLayout;QHBoxLayout * m_hbtnLayout;QSpacerItem * m_horizontalSpacer;QSpacerItem * m_horizontalSpacer_2;QPushButton * m_btnOK;QHBoxLayout * m_hpLayout;QGraphicsDropShadowEffect *m_pEffect;
//    QMap<ShadowMessageBox::Icon, QString> m_ico{{NoIcon, ""}};
};#endif // SHADOWMESSAGEBOX_H
#include "shadowmessagebox.h"ShadowMessageBox::ShadowMessageBox(QWidget *parent):QWidget(parent)
{this->setAttribute(Qt::WA_TranslucentBackground);this->setAttribute(Qt::WA_DeleteOnClose);this->setWindowFlags(this->windowFlags()|Qt::WindowStaysOnTopHint|Qt::FramelessWindowHint |Qt::Dialog);this->setWindowModality(Qt::WindowModal);this->setVisible(true);m_widg = new QWidget(this);m_pTitleBar = new TitleBar(m_widg);m_widg->installEventFilter(m_pTitleBar);m_widg->setWindowTitle("QMessageBox");m_widg->setWindowIcon(QIcon("D:\\1.ico"));QPalette pal(palette());pal.setColor(QPalette::Background, QColor(51, 153, 251, 255));m_widg->setAutoFillBackground(true);m_widg->setPalette(pal);m_pLayout = new QVBoxLayout(m_widg);m_pLayout->addWidget(m_pTitleBar);m_pLayout->addStretch();m_pLayout->setSpacing(0);m_pLayout->setContentsMargins(0, 0, 0, 5);m_widg->setLayout(m_pLayout);m_msgIcon  = new QLabel(m_widg);m_msgIcon->setFixedSize(48,48);m_msgIcon->setPixmap(QPixmap("D:/images/CG.png", "png"));m_msgText = new QLabel(m_widg);m_msgText->setStyleSheet("font: 20pt \"Microsoft YaHei\";color: white;");m_msgText->setText("导出成功");m_hlabLayout = new QHBoxLayout();m_hlabLayout->addWidget(m_msgIcon);m_hlabLayout->addWidget(m_msgText);m_hlabLayout->setContentsMargins(5,0,5,0);m_pLayout->addLayout(m_hlabLayout);m_hbtnLayout= new QHBoxLayout();m_horizontalSpacer= new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Expanding);m_hbtnLayout->addItem(m_horizontalSpacer);m_btnOK = new QPushButton(m_widg);m_btnOK->setFixedSize(72,25);m_btnOK->setText("OK");m_btnOK->setStyleSheet("border:1px solid rgba(0, 74, 169, 1);font: 10px \"Microsoft YaHei\";color: rgba(0, 0, 0, 1)");m_hbtnLayout->addWidget(m_btnOK);m_horizontalSpacer_2= new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Expanding);m_hbtnLayout->addItem(m_horizontalSpacer_2);connect(m_btnOK, &QPushButton::clicked, this, &QWidget::close);m_pLayout->addLayout(m_hbtnLayout);m_hpLayout = new QHBoxLayout(this);m_hpLayout->addWidget(m_widg);m_hpLayout->setContentsMargins(20, 20, 20, 20);m_pEffect = new QGraphicsDropShadowEffect(m_widg);m_pEffect->setOffset(0, 0);m_pEffect->setColor(QColor(QStringLiteral("black")));m_pEffect->setBlurRadius(30);m_widg->setGraphicsEffect(m_pEffect);}ShadowMessageBox::ShadowMessageBox(QWidget *parent, const QString &title, const QString &text , ShadowMessageBox::Icon icon):QWidget(parent)
{this->setAttribute(Qt::WA_TranslucentBackground);this->setAttribute(Qt::WA_DeleteOnClose);this->setWindowFlags(this->windowFlags()|Qt::WindowStaysOnTopHint|Qt::FramelessWindowHint |Qt::Dialog);this->setWindowModality(Qt::WindowModal);this->setVisible(true);m_widg = new QWidget(this);m_pTitleBar = new TitleBar(m_widg);m_widg->installEventFilter(m_pTitleBar);m_widg->setWindowTitle(title);m_widg->setWindowIcon(this->windowIcon());QPalette pal(palette());pal.setColor(QPalette::Background, QColor(51, 153, 251, 255));m_widg->setAutoFillBackground(true);m_widg->setPalette(pal);m_pLayout = new QVBoxLayout(m_widg);m_pLayout->addWidget(m_pTitleBar);m_pLayout->addStretch();m_pLayout->setSpacing(0);m_pLayout->setContentsMargins(0, 0, 0, 5);m_widg->setLayout(m_pLayout);m_msgIcon  = new QLabel(m_widg);m_msgIcon->setFixedSize(48,48);if (icon == ShadowMessageBox::Icon::Information) {m_msgIcon->setPixmap(QPixmap(":/images/images/TS.png"));}else if (icon == ShadowMessageBox::Icon::Critical) {m_msgIcon->setPixmap(QPixmap(":/images/images/CW.png"));}m_msgText = new QLabel(m_widg);m_msgText->setStyleSheet("font: 20pt \"Microsoft YaHei\";color: white;");m_msgText->setText(text);m_hlabLayout = new QHBoxLayout();m_hlabLayout->addWidget(m_msgIcon);m_hlabLayout->addWidget(m_msgText);m_hlabLayout->setContentsMargins(5,0,5,0);m_pLayout->addLayout(m_hlabLayout);m_hbtnLayout= new QHBoxLayout();m_horizontalSpacer= new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Expanding);m_hbtnLayout->addItem(m_horizontalSpacer);m_btnOK = new QPushButton(m_widg);m_btnOK->setFixedSize(72,25);m_btnOK->setText("OK");m_btnOK->setStyleSheet("border:1px solid rgba(0, 74, 169, 1);font: 10px \"Microsoft YaHei\";color: rgba(0, 0, 0, 1)");m_hbtnLayout->addWidget(m_btnOK);m_horizontalSpacer_2= new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Expanding);m_hbtnLayout->addItem(m_horizontalSpacer_2);connect(m_btnOK, &QPushButton::clicked, this, &QWidget::close);m_pLayout->addLayout(m_hbtnLayout);m_hpLayout = new QHBoxLayout(this);m_hpLayout->addWidget(m_widg);m_hpLayout->setContentsMargins(20, 20, 20, 20);m_pEffect = new QGraphicsDropShadowEffect(m_widg);m_pEffect->setOffset(0, 0);m_pEffect->setColor(QColor(QStringLiteral("black")));m_pEffect->setBlurRadius(30);m_widg->setGraphicsEffect(m_pEffect);}void ShadowMessageBox::information(QWidget *parent, const QString &title, const QString &text)
{ShadowMessageBox  * msgBox = new ShadowMessageBox(parent , title, text, ShadowMessageBox::Icon::Information);
}void ShadowMessageBox::critical(QWidget *parent, const QString &title, const QString &text)
{ShadowMessageBox * msgBox = new ShadowMessageBox(parent , title, text, ShadowMessageBox::Icon::Critical);
}

调用方法为:

 ShadowMessageBox::information(this, "提示", "提示");// 这个this必须指定

关于阴影的部分,我也是折腾了好一会,具体结构图如下:

本来的是想直接放在MainWindow下的,但是这个要设置窗口背景透明,这样就会导致其他的样式不对,所以就依附在一个新创建的widget上。代码如下:

// 首先你要把这个最外层的widget设置成透明this->setAttribute(Qt::WA_TranslucentBackground);this->setAttribute(Qt::WA_DeleteOnClose);this->setWindowFlags(this->windowFlags()|Qt::WindowStaysOnTopHint|Qt::FramelessWindowHint |Qt::Dialog);this->setWindowModality(Qt::WindowModal);this->setVisible(true);
// 然后要设置一个布局管理器,来设置间距。以达到显示阴影的目的m_hpLayout = new QHBoxLayout(this);m_hpLayout->addWidget(m_widg);m_hpLayout->setContentsMargins(20, 20, 20, 20); // 这里是设置上下左右的阴影宽度
// 这里就是给带标题栏的那个widget添加阴影m_pEffect = new QGraphicsDropShadowEffect(m_widg);m_pEffect->setOffset(0, 0);m_pEffect->setColor(QColor(QStringLiteral("black")));m_pEffect->setBlurRadius(30); // 设置阴影圆角m_widg->setGraphicsEffect(m_pEffect);

效果图如下:

这个阴影部分可以参考以下博客
标题栏
阴影
阴影
九宫格缩放图片原理
阴影(附带九宫格)
以上TitleBar这个类,是博主一去、二三里大神的博文中的一个标题栏的类,请移步Qt 之自定义界面(添加自定义标题栏),然后还参考了Qt官方的QMessageBox的设计,写出来了。本人代码水平不是特别的好,还有许多没有完善,里面应该有挺多的问题,只是给大家提供一个思路,烦请大家多多指正。

Qt 实现带阴影 无边框的QMessageBox相关推荐

  1. Qt 自定义界面(实现无边框、可移动)

    设置窗口标志为无边框 this->setWindowFlags(Qt::FramelessWindowHint); 设置无边框之后,窗体是无法移动的,下面我们介绍两种方式来进行移动. 1. Qt ...

  2. Qt实现半透明、无边框、可自由移动、不规则的窗体

    目录 预期效果 功能要点 实现步骤 进一步扩展应用 预期效果 先出示效果图一张,如果不是读者需要的,读者可以看完效果图之后就关闭本网页啦. 功能要点 窗口无边框 可自由拖动 背景透明度自定义 边框可设 ...

  3. wps带阴影的边框怎么设置_怎么把表格加框_win7系统下wps设置阴影边框的方法

    2017-06-20 09:31:11 Excel一款试算表软件,编辑表格或数据都会用到,一些细心的Win7系统用户发现在Excel表格中设置了分页符的文档看起来就比较难看,Excel的分页符线框是粗 ...

  4. wps带阴影的边框怎么设置_WPS图片阴影效果怎么添加?WPS表格阴影边框如何设置?...

    WPS图片阴影效果怎么添加?在WPS表格中,如果要保持图片的美观性,可以加一些边框,如果要表现图片的立体感,则可以添加阴影效果,WPS表格阴影边框如何设置的呢?其实很简单,只需要设置一下"形 ...

  5. wps带阴影的边框怎么设置_win7系统设置wps阴影边框的操作方法

    无论谁在使用电脑的时候都可能会发现设置wps阴影边框的问题,设置wps阴影边框让用户们很苦恼,这是怎么回事呢,设置wps阴影边框有什么简便的处理方式呢,其实只要依照1.打开WPS表格,并插入一张图: ...

  6. wps带阴影的边框怎么设置_win7系统下wps阴影边框的的图文教程?

    win7系统下wps阴影边框的的图文教程?? wps是一款经常会用到的办公软件,经常使用wps的win7系统用户应该都知道,在添加文本框的时候,如果添加阴影效果可以让文本看起来更好看,那么win7系统 ...

  7. wps带阴影的边框怎么设置_WPS表格阴影边框如何设置,小编告诉你如何设置

    文本框是我们是使用金山WPS这款办公软件时常常需要使用到的小工具,文本框具有插入的位置灵活,而且形式醒目的作用.经常使用WPS表格的朋友应该知道,文本框添加阴影效果可以让文本看起来更好看,在WPS文字 ...

  8. wps带阴影的边框怎么设置_WPS表格阴影边框如何设置,图文详解如何设置

    表格在文档中充当着一个极其重要的角色,既然是这样,那么你对它了解多少呢?除了可以设置图表区的单色填充与单色边框外,还可以设置图表阴影特效,下面为大家介绍下wps文字中如何设置表格边框,对此不熟练的朋友 ...

  9. wps带阴影的边框怎么设置_WPS表格阴影边框如何设置,教您如何设置

    WPS文字中文本框是一个经常使用到的小工具,因为文本框具有很大的用处,具有可移动.可调大小的文字或图形容器的功能,那我们怎么让WPS文字的文本框具有阴影效果呢?下面小编就为用户们介绍WPS设置文本框阴 ...

最新文章

  1. C++中前置声明介绍
  2. oracle和mysql查询_Oracle和MySQL分组查询GROUP BY
  3. 软件工程概论 课堂练习 第2次作业5【顺序图思考题——绘制手机拨号顺序图】
  4. new/delete与malloc/free
  5. python多线程爬虫数据顺序_Python爬虫必学知识点:多线程爬虫
  6. Yii防注入攻击笔记
  7. Spring事务管理1-------环境搭建
  8. windows7 iis安装 Windows Modules Installer服务无法启动
  9. Python安装时0x80070642问题解决
  10. 关于Maxon电机整定的问题记录
  11. Line in和Mic in的区别及使用
  12. 过去式-ed的发音规则
  13. 通达OAV12报表中心
  14. 1.3 飞桨开源深度学习平台介绍
  15. 福建农林大学计算机与信息学院副书记,福建农林大学计算机与信息学院导师介绍:钟一文...
  16. 微信移动UI设计规范
  17. bm 37 bm38
  18. 移动端性能测试必备工具PerfDog性能狗
  19. Oracle 同义词总结
  20. java打印等腰三角形

热门文章

  1. 上海市高校大学生程序设计邀请赛 C:小花梨判连通
  2. 来自东南亚的极兔被“封杀”,老家还能保住吗?
  3. html简单个人网页制作——我的家乡——四川文化(4页) HTML+CSS+JavaScript 家乡主题HTM5网页设计作业成品
  4. 程序员应具备的素质-拨乱反正篇
  5. 《次世代数据存储思维与技术》大纲
  6. 中国论坛排行榜,热门论坛网站排行榜,热门论坛网站排行榜[转]
  7. 童年中的电视剧你还记得几个?
  8. oracle对某两列求和再求和_分手再狠也不怕,3步让他主动求和
  9. chorme-调试模式基本使用
  10. 电子学会图形化一级编程题解析:猫捉老鼠