很多时候,应用程序都会给客户弹出提示框。一般地,我们需要让这个消息框标题栏中显示应用程序的名字。
dialog.png
如果使用Qt原生的MessageBox
来做,会写出下面的代码。
QMessageBox::critical(nullptr,
QStringLiteral("这是个应用名称"),
QStringLiteral("这是个消息), QMessageBox::Yes);
弹出消息框的代码会散落在程序各处, 而且消息框的内容也不一定,有可能有一百种。那么,每次弹窗,都要写一遍应用程序的名称。如果有一天应用改名了,或者给做OEM,那么会导致很大的工作量。
如果对QMessageBox
进行二次封装,可以很优雅的解决这个问题。
首先, 新建一个类,作为 QMessageBox
的 Wrapper.
class Dialog
{
public:
};
然后对QMessageBox::StandardButton
重新命名,使它成为我们自己的StandardButton
.
class Dialog
{
public:
// 为了能在 Dialog 类外使用这个类型名, 我把这个写在 public section 里
using StandardButton = QMessageBox::StandardButton;
};
然后开始封装QMessageBox::information();
。思路非常简单, 我们做一个Wrapper, 在这个Wrapper里获取应用程序名称, 然后传给QMessageBox::information()
。
// Dialog.h
class Dialog
{
public:
using StandardButton = QMessageBox::StandardButton;
static StandardButton information(const QString& msg,
StandardButton button0 = StandardButton::Ok,
StandardButton button1 = StandardButton::NoButton);
};
// Dialog.cpp
Dialog::StandardButton
Dialog::information(const QString& msg, Dialog::StandardButton okButton, Dialog::StandardButton noButton)
{
QString appName = qApp->applicationName();
StandardButton ret = QMessageBox::information(nullptr, appName, msg, okButton, noButton);
return ret;
}
为了让我们的Dialog
支持中文显示, 再给它加一个适配器。
// Dialog.h
class Dialog
{
//...
static StandardButton information(const wchar_t* msg,
StandardButton button0 = StandardButton::Ok,
StandardButton button1 = StandardButton::NoButton);
//...
};
// Dialog.cpp
Dialog::StandardButton Dialog::information(const wchar_t* msg, StandardButton button0, StandardButton button1)
{
return information(QString::fromWCharArray(msg), button0, button1);
}
同样地, 可以封装出 warning()
, critical()
等 QMessageBox 函数。它们使用起来非常方便,只需要这么做:
void func()
{
Dialog::information(L"我是消息框的内容");
}