QDockWidget详解

QDockWidget类提供了一个特殊的窗口部件,它可以是被锁在QMainWindow窗口内部或者是作为顶级窗口悬浮在桌面上。QDockWidget可以移动、悬浮,在许多工程软件中,都是使用dock布局窗口,用户可以自由组合窗口界面。

dock布局讲解

新建QMainWindow基类工程,在ui设计页面拖入7个QDockWidget控件。

因为整个窗口都由dock组成,所以在myMainWindow的构造函数中先把QMainWindow的中间窗口部件去除。

QWidget* central_form = takeCentralWidget();
if(central_form)
         delete central_form;

用setWindowTitle(const QString &)函数为每个dock添加标题便于后面区分。

ui->dockWidget_1->setWindowTitle("dock1");

接下来配置

setDockNestingEnabled(true);

这句语句是用来配置dock是否可以嵌套。通过查询帮助文档,我们可以知道,如果参数为false,则停靠区域只能水平或者垂直,即dock不能放置在中间,只能在两侧排布。如果参数为true,那么dock所占用的区域可以向任意方向排布。

接下来先移除所有的dock,我们来调整dock位置。调整dock位置前通过

addDockWidget(Qt::LeftDockWidgetArea,ui->dockWidget_1);

为第一个dock指定位置,接下来通过配置

void QMainWindow::splitDockWidget(QDockWidget *first, QDockWidget *second, Qt::Orientation orientation)

的参数对所有的dock进行排列,这个函数是将第一个停靠dock覆盖的空间分成两部分,将第一个停靠dock移动到第一部分中,并将第二个停靠dock移动到第二部分中。通过这样的方式可以先左右,再上下的原则依次对dock进行排列。例如:

  • Qt::Horizontal:将第二个dock置于第一个dock的右侧。
  • Qt::Vertical:将第二个停靠dock放在第一个停靠dock的下面。
    此时编译运行,

其它功能函数介绍

接下来,介绍几个常用的QDockWidget控件配置函数:

ui->dockWidget_3->setMinimumWidth(150);
ui->dockWidget_5->setMinimumHeight(100);
ui->dockWidget_1->setMaximumSize(100,100);
  • 配置dock最小的宽度、高度,最大尺寸。

QWidget* TitleBar = ui->dockWidget_2->titleBarWidget();
QWidget* EmptyWidget = new QWidget();
ui->dockWidget_2->setTitleBarWidget(EmptyWidget);
delete TitleBar;
  • 隐藏标题栏。

tabifyDockWidget(ui->dockWidget_4,ui->dockWidget_5);
  • 合并窗口,采用void QMainWindow::tabifyDockWidget(QDockWidget *first, QDockWidget *second)函数,将多个QDockWidget叠加到同一区域。

ui->dockWidget_4->setFeatures(QDockWidget::DockWidgetFloatable);

-通过
void setFeatures(DockWidgetFeatures features)配置dock是否可关闭、漂浮、拖动等属性,它的参数有:

常量描述
QDockWidget::DockWidgetClosable可关闭
QDockWidget::DockWidgetMovable可移动
QDockWidget::DockWidgetFloatable可漂浮
QDockWidget::DockWidgetVerticalTitleBar在左边显示垂直的标签栏
QDockWidget::AllDockWidgetFeatures具有1,2,3的所有功能
QDockWidget::NoDockWidgetFeatures无法关闭,不能移动,不能漂浮



代码

.h文件代码

#ifndef MYMAINWINDOW_H
#define MYMAINWINDOW_H

#include <QMainWindow>
#include "quiwidget.h"

namespace Ui {
class myMainWindow;
}

class myMainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit myMainWindow(QWidget *parent = 0);
    ~myMainWindow();
    void RemoveAllDock();
    void showDock(const QList<int> &index= QList<int>());

private:
    Ui::myMainWindow *ui;
    QList<QDockWidget*> dock_points;  
};

#endif // MYMAINWINDOW_H

.cpp文件代码

#include "mymainwindow.h"
#include "ui_mymainwindow.h"

myMainWindow::myMainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::myMainWindow)
{
    ui->setupUi(this);
    QWidget* central_form = takeCentralWidget();
    if(central_form)
         delete central_form;

    ui->dockWidget_1->setWindowTitle("dock1");
    ui->dockWidget_2->setWindowTitle("dock2");
    ui->dockWidget_3->setWindowTitle("dock3");
    ui->dockWidget_4->setWindowTitle("dock4");
    ui->dockWidget_5->setWindowTitle("dock5");
    ui->dockWidget_6->setWindowTitle("dock6");
    ui->dockWidget_7->setWindowTitle("dock7");

    setDockNestingEnabled(true);

    dock_points.append(ui->dockWidget_1);
    dock_points.append(ui->dockWidget_2);
    dock_points.append(ui->dockWidget_3);
    dock_points.append(ui->dockWidget_4);
    dock_points.append(ui->dockWidget_5);
    dock_points.append(ui->dockWidget_6);
    dock_points.append(ui->dockWidget_7);

    RemoveAllDock();

    addDockWidget(Qt::TopDockWidgetArea,ui->dockWidget_1);
    addDockWidget(Qt::LeftDockWidgetArea,ui->dockWidget_2);
    splitDockWidget(ui->dockWidget_2,ui->dockWidget_3,Qt::Horizontal);
    splitDockWidget(ui->dockWidget_2,ui->dockWidget_4,Qt::Vertical);
    splitDockWidget(ui->dockWidget_3,ui->dockWidget_6,Qt::Horizontal);
    splitDockWidget(ui->dockWidget_6,ui->dockWidget_7,Qt::Vertical);
    tabifyDockWidget(ui->dockWidget_4,ui->dockWidget_5);

    showDock(QList<int>()<< 0<<1<<2<<3<<4<<5<<6);
}

void myMainWindow::RemoveAllDock()
{
    for(int i=0;i<7;i++){
            removeDockWidget(dock_points[i]);
        }
}


void myMainWindow::showDock(const QList<int> &index)
{
    if (index.isEmpty()){
        for(int i=0;i<7;++i){
            dock_points[i]->show();
        }
    }
    else{
        foreach (int i, index) {
            dock_points[i]->show();
        }
    }
}

myMainWindow::~myMainWindow()
{
    delete ui;
}





点亮在看,扫码关注我吧


  • 5
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值