zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Qt之自定义界面(QMessageBox)

Qt 自定义 界面
2023-09-14 08:56:50 时间

通过前几节的自定义窗体的学习,我们可以很容易的写出一套属于自己风格的界面框架,通用于各种窗体,比如: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_OBJECT

public:

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

 // 添加控件-替换提示信息所在的QLabel

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

}

整体界面布局及事件处理参考了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 QpushButton 实现长按下功能 最近做项目需要一个按钮具备长时间按下的功能,才发现Qt原始的按钮是没有这个功能,不过Qt的原生按钮是存在按下和释放信号的,有了这两个信号,再来实现按钮长时间被按下,这就简单了,看下动画演示。
Qt-QML-Popup,弹层界面编写 随着接触Qt的时间的增加,也逐渐的发现了Qt 的一些不人信话的一些地方,不由的想起一句话,也不知道是在哪里看到的了“一切变成语言都是垃圾,就C++还可以凑合用”大致意思是这样。最近项目的祝界面框架都基本写完了,那自我感觉良好,感觉自己QML的不得了了,全部用的都是自己YY出来的空间,今天小伙伴在同伴代码后,用到了我的模块,给我说了一个BUG,