qt的原对话框显示太过于原始,为了显示更加现代化,可以对QDialog类做一层封装,继承QDialog并做一些设计和基本接口。其类源代码实现如下:
h文件:
#ifndef FANCYDIALOG_H
#define FANCYDIALOG_H
#include <QDialog>
//对话框界面类
class FancyDialogPrivate;
class FancyDialog : public QDialog
{
Q_OBJECT
public:
explicit FancyDialog(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
~FancyDialog();
void setCentralWidget(QWidget *w);
void setWidgetResizable(bool resizable);
void setTitleBarHeight(int height);
void addAdditionalControl(QAction *action);
void setFixedSize(const QSize &s);
void setFixedSize(int w, int h);
void setFixedWidth(int w);
void setFixedHeight(int h);
void setWindowFlags(Qt::WindowFlags type);
protected:
virtual void paintEvent(QPaintEvent *event);
private:
FancyDialogPrivate *d;
};
#endif // FANCYDIALOG_H
cpp文件:
#include "fancydialog.h"
#include "fancybar.h"
#include "qcanpool_p.h"
#include <QVBoxLayout>
#include <QSettings>
#include <QPainter>
class FancyDialogPrivate
{
public:
FancyDialogPrivate();
FancyBar *fancyBar;
QWidget *centralWidget;
};
FancyDialogPrivate::FancyDialogPrivate()
{
fancyBar = nullptr;
centralWidget = nullptr;
}
FancyDialog::FancyDialog(QWidget *parent, Qt::WindowFlags f)
: QDialog(parent), d(new FancyDialogPrivate())
{
QDialog::setWindowFlags(Qt::FramelessWindowHint |
Qt::WindowSystemMenuHint |
// Qt::WindowMinimizeButtonHint |
Qt::Dialog | f
);
d->fancyBar = new FancyBar(this);
d->fancyBar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
d->centralWidget = new QWidget();
QVBoxLayout *layout = new QVBoxLayout();
layout->setContentsMargins(1, 0, 1, 1);
layout->setSpacing(0);
layout->addWidget(d->fancyBar);
layout->addWidget(d->centralWidget);
setLayout(layout);
resize(800, 600);
}
FancyDialog::~FancyDialog()
{
delete d;
}
void FancyDialog::setCentralWidget(QWidget *w)
{
if (d->centralWidget == w || w == nullptr) {
return;
}
if (d->centralWidget) {
layout()->removeWidget(d->centralWidget);
d->centralWidget->setParent(nullptr);
d->centralWidget->deleteLater();
}
d->centralWidget = w;
layout()->addWidget(d->centralWidget);
}
void FancyDialog::setWidgetResizable(bool resizable)
{
d->fancyBar->setWidgetResizable(resizable);
}
void FancyDialog::setTitleBarHeight(int height)
{
d->fancyBar->setTitleBarHeight(height);
}
void FancyDialog::addAdditionalControl(QAction *action)
{
d->fancyBar->addAdditionalControl(action, FancyBar::TitlePosition);
}
void FancyDialog::setFixedSize(const QSize &s)
{
setFixedSize(s.width(), s.height());
}
void FancyDialog::setFixedSize(int w, int h)
{
d->fancyBar->setWidgetResizable(false);
QWidget::setFixedSize(w, h);
}
void FancyDialog::setFixedWidth(int w)
{
setFixedSize(w, this->height());
}
void FancyDialog::setFixedHeight(int h)
{
setFixedSize(this->width(), h);
}
void FancyDialog::setWindowFlags(Qt::WindowFlags type)
{
QDialog::setWindowFlags(type);
d->fancyBar->updateWidgetFlags();
}
void FancyDialog::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QSettings settings(QCanpoolPrivate::g_settingsOrganization,
QCanpoolPrivate::g_settingsApplication);
QString skinName = settings.value("skin").toString();
if (skinName.isEmpty()) {
skinName = QString(":/skin/default");
}
QPainter painter(this);
painter.setPen(Qt::NoPen);
painter.setBrush(Qt::gray);
painter.drawPixmap(QRect(0, 0, this->width(), this->height()),
QPixmap(skinName));
}
demo1设计:
设计一个文本信息显示框。
void MainWindow::slot_Button_1()
{
QTextBrowser *tb = new QTextBrowser(this);
tb->insertPlainText("your text");
FancyDialog dialog;
dialog.setCentralWidget(tb);
dialog.exec();
}
demo2设计:
为弹窗添加action。
void MainWindow::slot_button_2()
{
FancyDialog dialog;
dialog.setTitleBarHeight(30);
dialog.addAdditionalControl(new QAction(QIcon(":/tools/new"), tr("Stop"),this));
dialog.addAdditionalControl(new QAction(QIcon(":/tools/open"), tr("Stop"),this));
dialog.addAdditionalControl(new QAction(QIcon(":/tools/save"), tr("Stop"),this));
dialog.addAdditionalControl(new QAction(QIcon(":/tools/cut"), tr("Stop"),this));
dialog.exec();
}