停靠窗口(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()
{
}