QDockWidget自定义标题栏

停靠窗口(dock window)是指一些可以停靠在QMainWindow中或是浮动为独立窗口的窗口。QMainWindow提供了4个停靠窗口区域:分别在中央窗口部件的上部、下部、左侧和右侧。诸如像Microsoft Visual Studio和Qt Linguist这样的应用程序都广泛使用了停靠窗口,以提供一种非常灵活的用户接口方式。在Qt中,各个停靠窗口都是QDockWidget的实例。每一个停靠窗口都有自己的标题栏,即使它处于停靠时也是如此。通过拖拽这一标题栏,用户可以把停靠窗口从一个停靠区域移动到另外一个停靠区域。通过把这个停靠窗口拖动到其他停靠区域的外面,就可以把停靠窗口从一个停靠区域中分离出来,让它成为一个独立的窗口。

如果想保存所有停靠窗口和工具栏的位置,以使下一次运行应用程序时能够恢复它们的值,那么可以使用QMainWindow的sayeState()和restoreState()函数

QDockWidget自定义标题栏关键代码:

    QDockWidget *dock = new QDockWidget(tr("DockWindow1"),this);
    dock->setTitleBarWidget(new Titlebar(dock));//设置自定义标题栏

效果图
在这里插入图片描述

头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLabel>
#include <QHBoxLayout>
#include <QDockWidget>
#include <QMouseEvent>
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    protected:
    void closeEvent(QCloseEvent *event) override;
    private:
    void writeSettings();
    void readSettings();
};

class Titlebar : public QWidget { //QWidget
  Q_OBJECT

public:
  Titlebar(QWidget* parent)
  {
    label_title = new QLabel( parent->windowTitle() );
    label_title->setAlignment(Qt::AlignCenter);
    label_title->setFixedHeight(20);
    setStyleSheet("background:DarkSlateGray");

    this->setWindowFlags(Qt::Window
                         | Qt::WindowMinimizeButtonHint
                         | Qt::WindowMaximizeButtonHint
                         | Qt::CustomizeWindowHint);

    QHBoxLayout* layoutInner = new QHBoxLayout(this);
    layoutInner->setSpacing(0);
    layoutInner->setMargin(0);
    layoutInner->addWidget(label_title);


  }

protected:
//   void mousePressEvent(QMouseEvent *event) override
//   {
//
//   }
//  virtual void mouseReleaseEvent(QMouseEvent *event);
//  virtual void mouseDoubleClickEvent(QMouseEvent *event);
//  virtual void mouseMoveEvent(QMouseEvent *event);
signals:
public slots:

private:
  QLabel* label_title;


};


#endif // MAINWINDOW_H

源文件

#include "mainwindow.h"
#include <QDockWidget>
#include <QChart>
#include <QChartView>
#include <QPieSeries>
#include <QPieSlice>
#include <QGraphicsLayout>
#include <QApplication>
#include <QDesktopWidget>

QT_CHARTS_USE_NAMESPACE

QChart *creatDonutChart()
{
    QPieSeries *series=new QPieSeries();
    series->setHoleSize(0.35);//圆孔大小
    series->append("Protein 4.2%",4.2);


    QPieSlice *slice=series->append("Fat 15.6%",15.6);//单个切片
    slice->setExploded();//使该切片突出
    slice->setLabelVisible();//显示切片的标签
    series->append("Other 23.8%", 23.8);
    series->append("Carbs 56.4%", 56.4);//若以圆心为原点,作xoy坐标系,则以y轴为起始轴,圆环的每一小部分按照编程顺序顺时针排列。
    QChart *chart = new QChart;
    chart->setMargins(QMargins(0, 0, 0, 0));//设置内边界全部为0
    chart->setBackgroundRoundness(0);       //设置背景区域无圆角
    chart->layout()->setContentsMargins(0, 0, 0, 0);//设置外边界全部为0


    //chart->setTitle("Donut with a lemon glaze (100g)");
    chart->addSeries(series);
    chart->legend()->setAlignment(Qt::AlignBottom);//图例放在底部
    chart->setTheme(QChart::ChartThemeBlueCerulean);//主题颜色设置为天然色
    chart->legend()->setFont(QFont("Arial",7));//图例字体宋体7号字


    //标题栏

    return chart;
}

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{

    QRect deskRect = QApplication::desktop()->availableGeometry();
    setMinimumWidth(1000);
    setMinimumHeight(width()/(static_cast<float>(deskRect.width())/deskRect.height()));

    setStyleSheet("background:	LightSlateBlue");
//    setWindowTitle(tr("DockWidget"));
    QChartView *chartView=new QChartView(this);
    chartView->setRenderHint(QPainter::Antialiasing);
    chartView->setChart(creatDonutChart());
    setCentralWidget(chartView);

    QDockWidget *dock = new QDockWidget(tr("DockWindow1"),this);
    dock->setTitleBarWidget(new Titlebar(dock));
    dock->setFeatures(QDockWidget::AllDockWidgetFeatures); //具有全部特性
    dock->setAllowedAreas(Qt::AllDockWidgetAreas);
    chartView=new QChartView(this);
    chartView->setRenderHint(QPainter::Antialiasing);
    chartView->setChart(creatDonutChart());
    chartView->setMinimumWidth(200);
    chartView->setMinimumHeight(chartView->width()/(static_cast<float>(deskRect.width())/deskRect.height()));
    dock->setWidget(chartView);
    addDockWidget(Qt::RightDockWidgetArea,dock);


    dock = new QDockWidget(tr("DockWindow2"),this);
    dock->setTitleBarWidget(new Titlebar(dock));
    dock->setFeatures(QDockWidget::AllDockWidgetFeatures); //具有全部特性
    dock->setAllowedAreas(Qt::AllDockWidgetAreas);
    chartView=new QChartView(this);
    chartView->setRenderHint(QPainter::Antialiasing);
    chartView->setChart(creatDonutChart());
    dock->setWidget(chartView);
    addDockWidget(Qt::RightDockWidgetArea,dock);



    dock = new QDockWidget(tr("DockWindow3"),this);
    dock->setTitleBarWidget(new Titlebar(dock));
    dock->setFeatures(QDockWidget::AllDockWidgetFeatures); //具有全部特性
    dock->setAllowedAreas(Qt::AllDockWidgetAreas);
    chartView=new QChartView(this);
    chartView->setRenderHint(QPainter::Antialiasing);
    chartView->setChart(creatDonutChart());
    dock->setWidget(chartView);
    addDockWidget(Qt::LeftDockWidgetArea,dock);



    dock = new QDockWidget(tr("DockWindow4"),this);
    dock->setTitleBarWidget(new Titlebar(dock));
    dock->setFeatures(QDockWidget::AllDockWidgetFeatures); //具有全部特性
    dock->setAllowedAreas(Qt::AllDockWidgetAreas);
    chartView=new QChartView(this);
    chartView->setRenderHint(QPainter::Antialiasing);
    chartView->setChart(creatDonutChart());
    chartView->setMinimumWidth(200);
    chartView->setMinimumHeight(chartView->width()/(static_cast<float>(deskRect.width())/deskRect.height()));
    dock->setWidget(chartView);
    addDockWidget(Qt::LeftDockWidgetArea,dock);


    dock = new QDockWidget(tr("DockWindow5"),this);
    dock->setTitleBarWidget(new Titlebar(dock));
    dock->setFeatures(QDockWidget::AllDockWidgetFeatures); //具有全部特性
    dock->setAllowedAreas(Qt::AllDockWidgetAreas);
    chartView=new QChartView(this);
    chartView->setRenderHint(QPainter::Antialiasing);
    chartView->setChart(creatDonutChart());
    dock->setWidget(chartView);
    addDockWidget(Qt::BottomDockWidgetArea,dock);

    dock = new QDockWidget(tr("DockWindow6"),this);
    dock->setTitleBarWidget(new Titlebar(dock));
    dock->setFeatures(QDockWidget::AllDockWidgetFeatures); //具有全部特性
    dock->setAllowedAreas(Qt::AllDockWidgetAreas);
    chartView=new QChartView(this);
    chartView->setRenderHint(QPainter::Antialiasing);
    chartView->setChart(creatDonutChart());
    chartView->setMinimumWidth(200);
    chartView->setMinimumHeight(chartView->width()/(static_cast<float>(deskRect.width())/deskRect.height()));
    dock->setWidget(chartView);
    addDockWidget(Qt::BottomDockWidgetArea,dock);


//    enum DockWidgetArea {
//        LeftDockWidgetArea = 0x1,
//        RightDockWidgetArea = 0x2,
//        TopDockWidgetArea = 0x4,
//        BottomDockWidgetArea = 0x8,

//        DockWidgetArea_Mask = 0xf,
//        AllDockWidgetAreas = DockWidgetArea_Mask,
//        NoDockWidgetArea = 0
//    };
//    enum Corner {
//        TopLeftCorner = 0x00000,
//        TopRightCorner = 0x00001,
//        BottomLeftCorner = 0x00002,
//        BottomRightCorner = 0x00003
//    };
    QMainWindow::setCorner(Qt::BottomLeftCorner,Qt::LeftDockWidgetArea);//左下角属于左侧
    QMainWindow::setCorner(Qt::BottomRightCorner,Qt::RightDockWidgetArea);
    QMainWindow::setCorner(Qt::TopLeftCorner,Qt::LeftDockWidgetArea);
    QMainWindow::setCorner(Qt::TopRightCorner,Qt::RightDockWidgetArea);
    readSettings();
}

void MainWindow::writeSettings(){
    QSettings settings ("Software Inc.", "QDockWidget test");
    settings.beginGroup("mainWindow");
    settings.setValue("geometry", saveGeometry());
    settings.setValue ("state", saveState());
    settings.endGroup();
}
void MainWindow::readSettings()
{
    QSettings settings ("Software Inc.", "QDockWidget test");
    settings.beginGroup("mainWindow");
    restoreGeometry(settings.value ("geometry").toByteArray());
    restoreState(settings.value("state").toByteArray());
    settings.endGroup();
}
void MainWindow::closeEvent(QCloseEvent *event)
{
    writeSettings();
    event->accept();
}
MainWindow::~MainWindow()
{
}

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值