简述

通过前几节的自定义窗体的学习,我们可以很容易的写出一套属于自己风格的界面框架,通用于各种窗体,比如:QWidget、QDialog、QMainWindow。

大多数窗体的实现都是采用控件堆积来完成的,只要思路清晰,再复杂的界面实现起来都游刃有余。下面我来列举一个由QMessageBox扩展的提示框-根据其源码实现思路来实现!

| 版权声明:一去、二三里,未经博主允许不得转载。

效果

自定义提示框

实现

message_box.h

#ifndef MESSAGE_BOX
#define MESSAGE_BOX#include <QMessageBox>
#include <QDialogButtonBox>
#include <QGridLayout>
#include "custom_window.h"class QLabel;class MessageBox : public CustomWindow
{Q_OBJECTpublic:explicit MessageBox(QWidget *parent = 0, const QString &title = tr("Tip"), const QString &text = "",QMessageBox::StandardButtons buttons = QMessageBox::Ok, QMessageBox::StandardButton defaultButton = QMessageBox::Ok);~MessageBox();QAbstractButton *clickedButton() const;QMessageBox::StandardButton standardButton(QAbstractButton *button) const;// 设置默认按钮void setDefaultButton(QPushButton *button);void setDefaultButton(QMessageBox::StandardButton button);// 设置窗体标题void setTitle(const QString &title);// 设置提示信息void setText(const QString &text);// 设置窗体图标void setIcon(const QString &icon);// 添加控件-替换提示信息所在的QLabelvoid addWidget(QWidget *pWidget);protected:// 多语言翻译void changeEvent(QEvent *event);private slots:void onButtonClicked(QAbstractButton *button);private:void translateUI();int execReturnCode(QAbstractButton *button);private:QLabel *m_pIconLabel;QLabel *m_pLabel;QGridLayout *m_pGridLayout;QDialogButtonBox *m_pButtonBox;QAbstractButton *m_pClickedButton;QAbstractButton *m_pDefaultButton;
};

message_box.cpp

#include <QLabel>
#include <QPushButton>
#include <QMessageBox>
#include <QCheckBox>
#include <QHBoxLayout>
#include <QEvent>
#include <QApplication>
#include "message_box.h"MessageBox::MessageBox(QWidget *parent, const QString &title, const QString &text,QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton): CustomWindow(parent)
{setWindowIcon(QIcon(":/Images/logo"));setWindowTitle(title);setMinimumSize(300, 130);setMinimizeVisible(false);setMaximizeVisible(false);setWidgetResizable(false);m_pButtonBox = new QDialogButtonBox(this);m_pButtonBox->setStandardButtons(QDialogButtonBox::StandardButtons(int(buttons)));setDefaultButton(defaultButton);QPushButton *pYesButton = m_pButtonBox->button(QDialogButtonBox::Yes);if (pYesButton != NULL){pYesButton->setObjectName("blueButton");pYesButton->setStyle(QApplication::style());}m_pIconLabel = new QLabel(this);m_pLabel = new QLabel(this);QPixmap pixmap(":/Images/information");m_pIconLabel->setPixmap(pixmap);m_pIconLabel->setFixedSize(35, 35);m_pIconLabel->setScaledContents(true);m_pLabel->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);m_pLabel->setObjectName("whiteLabel");m_pLabel->setOpenExternalLinks(true);m_pLabel->setText(text);m_pGridLayout = new QGridLayout();m_pGridLayout->addWidget(m_pIconLabel, 0, 0, 2, 1, Qt::AlignTop);m_pGridLayout->addWidget(m_pLabel, 0, 1, 2, 1);m_pGridLayout->addWidget(m_pButtonBox, m_pGridLayout->rowCount(), 0, 1, m_pGridLayout->columnCount());m_pGridLayout->setSizeConstraint(QLayout::SetNoConstraint);m_pGridLayout->setHorizontalSpacing(10);m_pGridLayout->setVerticalSpacing(10);m_pGridLayout->setContentsMargins(10, 10, 10, 10);m_pLayout->addLayout(m_pGridLayout);translateUI();connect(m_pButtonBox, SIGNAL(clicked(QAbstractButton*)), this, SLOT(onButtonClicked(QAbstractButton*)));
}MessageBox::~MessageBox()
{}void MessageBox::changeEvent(QEvent *event)
{switch (event->type()){case QEvent::LanguageChange:translateUI();break;default:CustomWindow::changeEvent(event);}
}void MessageBox::translateUI()
{QPushButton *pYesButton = m_pButtonBox->button(QDialogButtonBox::Yes);if (pYesButton != NULL)pYesButton->setText(tr("Yes"));QPushButton *pNoButton = m_pButtonBox->button(QDialogButtonBox::No);if (pNoButton != NULL)pNoButton->setText(tr("No"));QPushButton *pOkButton = m_pButtonBox->button(QDialogButtonBox::Ok);if (pOkButton != NULL)pOkButton->setText(tr("Ok"));QPushButton *pCancelButton = m_pButtonBox->button(QDialogButtonBox::Cancel);if (pCancelButton != NULL)pCancelButton->setText(tr("Cancel"));
}QMessageBox::StandardButton MessageBox::standardButton(QAbstractButton *button) const
{return (QMessageBox::StandardButton)m_pButtonBox->standardButton(button);
}QAbstractButton *MessageBox::clickedButton() const
{return m_pClickedButton;
}int MessageBox::execReturnCode(QAbstractButton *button)
{int nResult = m_pButtonBox->standardButton(button);return nResult;
}void MessageBox::onButtonClicked(QAbstractButton *button)
{m_pClickedButton = button;done(execReturnCode(button));
}void MessageBox::setDefaultButton(QPushButton *button)
{if (!m_pButtonBox->buttons().contains(button))return;m_pDefaultButton = button;button->setDefault(true);button->setFocus();
}void MessageBox::setDefaultButton(QMessageBox::StandardButton button)
{setDefaultButton(m_pButtonBox->button(QDialogButtonBox::StandardButton(button)));
}void MessageBox::setTitle(const QString &title)
{setWindowTitle(title);
}void MessageBox::setText(const QString &text)
{m_pLabel->setText(text);
}void MessageBox::setIcon(const QString &icon)
{m_pIconLabel->setPixmap(QPixmap(icon));
}void MessageBox::addWidget(QWidget *pWidget)
{m_pLabel->hide();m_pGridLayout->addWidget(pWidget, 0, 1, 2, 1);
}

接口说明

  • CustomWindow

    主要对界面的无边框可拖动进行了封装

  • MessageBox

    整体界面布局及事件处理参考了QMessageBox源码,接口包含:设置标题、提示信息、默认按钮及事件触发等操作。

二次封装

针对于各种提示框,我们可以再次进行封装,将常用的提取出来,作为全局函数来使用。

QMessageBox::StandardButton showInformation(QWidget *parent, const QString &title,const QString &text, QMessageBox::StandardButtons buttons,QMessageBox::StandardButton defaultButton)
{MessageBox msgBox(parent, title, text, buttons, defaultButton);msgBox.setIcon(":/Images/information");if (msgBox.exec() == -1)return QMessageBox::Cancel;return msgBox.standardButton(msgBox.clickedButton());
}QMessageBox::StandardButton showError(QWidget *parent, const QString &title,const QString &text, QMessageBox::StandardButtons buttons,QMessageBox::StandardButton defaultButton)
{MessageBox msgBox(parent, title, text, buttons, defaultButton);msgBox.setIcon(":/Images/error");if (msgBox.exec() == -1)return QMessageBox::Cancel;return msgBox.standardButton(msgBox.clickedButton());
}QMessageBox::StandardButton showSuccess(QWidget *parent, const QString &title,const QString &text, QMessageBox::StandardButtons buttons,QMessageBox::StandardButton defaultButton)
{MessageBox msgBox(parent, title, text, buttons, defaultButton);msgBox.setIcon(":/Images/success");if (msgBox.exec() == -1)return QMessageBox::Cancel;return msgBox.standardButton(msgBox.clickedButton());
}QMessageBox::StandardButton showQuestion(QWidget *parent, const QString &title,const QString &text, QMessageBox::StandardButtons buttons,QMessageBox::StandardButton defaultButton)
{MessageBox msgBox(parent, title, text, buttons, defaultButton);msgBox.setIcon(":/Images/question");if (msgBox.exec() == -1)return QMessageBox::Cancel;return msgBox.standardButton(msgBox.clickedButton());
}QMessageBox::StandardButton showWarning(QWidget *parent, const QString &title,const QString &text, QMessageBox::StandardButtons buttons,QMessageBox::StandardButton defaultButton)
{MessageBox msgBox(parent, title, text, buttons, defaultButton);msgBox.setIcon(":/images/warning");if (msgBox.exec() == -1)return QMessageBox::Cancel;return msgBox.standardButton(msgBox.clickedButton());
}QMessageBox::StandardButton showCritical(QWidget *parent, const QString &title,const QString &text, QMessageBox::StandardButtons buttons,QMessageBox::StandardButton defaultButton)
{MessageBox msgBox(parent, title, text, buttons, defaultButton);msgBox.setIcon(":/Images/warning");if (msgBox.exec() == -1)return QMessageBox::Cancel;return msgBox.standardButton(msgBox.clickedButton());
}QMessageBox::StandardButton showCheckBoxQuestion(QWidget *parent, const QString &title,const QString &text, QMessageBox::StandardButtons buttons,QMessageBox::StandardButton defaultButton)
{MessageBox msgBox(parent, title, text, buttons, defaultButton);msgBox.setIcon(":/Images/question");QCheckBox *pCheckBox = new QCheckBox(&msgBox);pCheckBox->setText(text);msgBox.addWidget(pCheckBox);if (msgBox.exec() == -1)return QMessageBox::Cancel;QMessageBox::StandardButton standardButton = msgBox.standardButton(msgBox.clickedButton());if (standardButton == QMessageBox::Yes){return pCheckBox->isChecked() ? QMessageBox::Yes : QMessageBox::No;}return QMessageBox::Cancel;
}

使用方式

showInformation(this, QStringLiteral("提示"), QStringLiteral("这是一个普通的提示框-Information!"));
showQuestion(this, QStringLiteral("提示"), QStringLiteral("这是一个普通的提示框-Question!"));
showSuccess(this, QStringLiteral("提示"), QStringLiteral("这是一个普通的提示框-Success!"));
showError(this, QStringLiteral("提示"), QStringLiteral("这是一个普通的提示框-Error!"));

源码学习

其实Qt中有很多自带的比较好的效果,里面用了很好的实现方式,建议安装的时候把源码download下来,随时可以研究并学习。例如:D:\Qt\Qt5.5.1\5.5\Src\qtbase\src\widgets\dialogs下面包含了所有关于dialog的实现-QProgressDialog、QMessageBox、QFileDialog。。。

Qt 之自定义界面(QMessageBox)相关推荐

  1. Qt中的QMessageBox

    文章目录 1 Qt中的QMessageBox 1 Qt中的QMessageBox 消息对话框是应用程序中最常见的界面元素,消息对话框主要用于: 为用户提示重要信息. 强制用户进行操作选择. 消息对话框 ...

  2. [转载]Qt之自定义界面(二)添加最小化、关闭按钮、添加背景

    很棒的文章 原文地址:Qt之自定义界面(二)添加最小化.关闭按钮.添加背景作者:一去丶二三里 在进行自定义界面之后,Qt界面并不像我们想象的那么完美,也许与我们的预期大相径庭,但是不必心烦,这只不过是 ...

  3. [转载]Qt之自定义界面(二)添加最小化、关闭按钮、添加背景_vortex_新浪博客...

    很棒的文章 原文地址:Qt之自定义界面(二)添加最小化.关闭按钮.添加背景作者:一去丶二三里 在进行自定义界面之后,Qt界面并不像我们想象的那么完美,也许与我们的预期大相径庭,但是不必心烦,这只不过是 ...

  4. Qt学习:QMessageBox(消息对话框)

    一.Qt学习 1.QMessageBox(消息对话框) Ⅰ.错误对话框 QMessageBox::critical(this,"critical","错误"); ...

  5. Qt总结:QMessageBox(原生态弹出框及究极超nice封装自定义弹出框)

    一.前言 在Qt中经常需要弹出窗口,QMessageBox可以实现此功能,一共有三种窗口,information, question, 和 warning,critical, about分别对应感叹号 ...

  6. NSIS + QT 制作自定义界面安装包

    NSIS + DUI(DLL形式)制作自定义界面的安装包有很多教程,但是NSIS + QT(DLL形式)实现自定义界面安装包的,翻遍全网,还真没找到有用的资料,无奈只能自己写一个! 先看效果,后续再分 ...

  7. Qt之自定义界面(窗体缩放)

    简述 通过前两节内容,我们实现了自定义窗体的移动,以及自定义标题栏-用来显示窗体的图标.标题,以及控制窗体最小化.最大化.关闭. 在这之后,我们还缺少窗体的缩放-当鼠标移动到窗体的边框-左.上.右.下 ...

  8. Qt 实现带阴影 无边框的QMessageBox

    Qt 实现带阴影的QMessagebox 在实际项目里面使用到了QMessageBox做一个弹窗,最开始是样式不是需要的样式,就去找了一下QMessageBox的样式表,一般来说可以使用findChi ...

  9. QT学习:基本对话框

    在QT的基本对话框中包括标准文件对话框.标准颜色对话框.标准字体对话框.标准输入对话框以及标准消息对话框,各种标准基本对话框通过调用各自不同的静态函数来完成其功能. 下图为标准基本对话框所需的静态函数 ...

最新文章

  1. Android 获取apk签名的fingerprint
  2. 图像也能做情感迁移?罗切斯特大学团队提出计算机视觉新任务
  3. Java并发- 读写锁中的性能之王:StampedLock
  4. iOS10 UI教程视图的边界与视图的框架
  5. jsp中session 失效设置
  6. QML基础类型之geocircle
  7. iOS 抓包工具 charles工具
  8. Week04《Java程序设计》第四周学习总结
  9. Linux 进程间通信(IPC)---大总结
  10. c++字符数组整数转换中文大写金额的形式_如何对PHP日期数组进行排序
  11. oracle 分页过程,oracle存储过程分页的完整例子
  12. 终端如何粘贴快捷键_linux shell实用快捷键
  13. 做电话营销,如何避免成为骚扰电话
  14. SpringBoot集成海康威视Linux版本
  15. MacOS上MPV播放器常用快捷键(增加画面旋转快捷键)
  16. 计算机如何连接wifi台式,无线网卡怎么连接台式电脑_台式机添加无线网的方法...
  17. JPA查询数据,报错Page 1 of 0 containing UNKNOWN instances
  18. 短信验证码,在键盘显示验证码
  19. Oracle开发 之 主-外键约束FK及约束的修改
  20. 微信公众号文章采集方案

热门文章

  1. GPU上的相似度检测(PNSR 和 SSIM)
  2. 【SIGIR 2022】ADPL: Adversarial Prompt-based Domain Adaptation for Dialogue Summarization with Knowled
  3. 调用腾讯视频播放器APi代码
  4. pycharm中Available packag位置
  5. MyBatis:Invalid bound statement (not found)
  6. jQuery EasyUI parser
  7. Masonry实现九宫格布局
  8. OpenGL进阶之立方体贴图
  9. uusee花4000万买个奥运转播权
  10. 使用nodeitk进行角点检測