天天看点

qcanpool开源代码之对话框

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();
}
           
qcanpool开源代码之对话框

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();
}
           
qcanpool开源代码之对话框

继续阅读