Qt之QDockWidget嵌套布局详解-实现Visual Studio布局

本文详细介绍了如何在Qt中使用QDockWidget进行嵌套布局,以实现类似Visual Studio的界面自定义。通过addDockWidget、splitDockWidget和tabifyDockWidget函数,可以创建复杂的窗口布局,包括水平和垂直分割以及标签化窗口。通过代码示例展示了如何设置和调整QDockWidget的位置,以达到高度灵活的界面设计。
摘要由CSDN通过智能技术生成

Qt之QDockWidget嵌套布局详解-实现Visual Studio布局

概述

许多工程软件,如Qt Creator,VS,matlab等,都是使用dock布局窗口,这样用户可以自定义界面,自由组合窗口。
Qt的嵌套布局由QDockWidget完成,用Qt Creator拖界面得到的dock布置形式比较固定,不能得想要的任意组合形式,要得到如下图所示的效果,后续布局必须通过代码来完成。
这里写图片描述
下面说说如何实现完全自由的界面布局效果:

QDockWidget在QMainWindow的布局函数

要在QMainWindow里对dock进行布局,需要用到如下几个函数:

  • 添加dock函数
    此函数用于给dock指定位置,同时也可以更改dock的位置,此函数命名为addDockWidget有点容易误导,因为不仅仅有add的功能,还有chang的功能

 
 
 
  1. void QMainWindow ::addDockWidget(Qt ::DockWidgetArea area, QDockWidget * dockwidget)
  2. void QMainWindow ::addDockWidget(Qt ::DockWidgetArea area, QDockWidget * dockwidget, Qt ::Orientation orientation)
  • splitDockWidget 分割dock窗口函数                                                                                                                                        

此函数的功能是把两个dock进行左右或上下并排布置,做成一个类似QSplit的功能

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

 

  • tabifyDockWidget tab化窗口函数
    此函数的功能是把多个dock变成一个tab形式的窗体
void QMainWindow::tabifyDockWidget(QDockWidget * first, QDockWidget * second)
 
 
 

 

  • 设置dock嵌套布局
    此函数是设置嵌套布局的关键
void QMainWindow::setDockNestingEnabled(bool enabled)
 
 
 

 

以上几个函数就能完成比较复杂的嵌套布局了。

设置嵌套布局

下面通过例子来讲解如何设置复杂的嵌套布局
先用Qt Creator拖放9个dock进视图里,为了好区分,给每个dock设置一个背景颜色:

这里写图片描述


dock属性随便设置,保证都任意区域可以停靠即可
由于这里不需要MainWindow的中间窗口,整个视图都由dock组成,因此先把QMainWindow的中间窗口部件去除:
在MainWindow的构造函数加入如下语句,即可把MainWindow的中间窗口去除,这时整个MainWindow只有Dock组成


 
 
 
  1. QWidget* p = takeCentralWidget();
  2. if(p)
  3. delete p;

 

编译出来的效果如图所示:

这里写图片描述


拖动dock可以发现,只能在两边进行组合,我想把dock放置到中间是无法实现的,这是由于为了简化dock的吸附,QMainWindow默认是把dock嵌套关闭的,需要我们手动设置,在MainWindow的构造函数里添加:

setDockNestingEnabled(true);
 
 
 

 

即可打开嵌套功能,这时编译出来的窗口能实现如下嵌套:

这里写图片描述


此时,整个窗口的布局将变得非常灵活且复杂,由于Qt Creator在ui编辑器中无法像编译出来的程序那样任意调整位置,因此需要手动对窗口进行设置。下面将介绍如何用代码设置复杂的dock
为了方便,添加两个函数和一个成员变量:
head:


 
 
 
  1. public:
  2. //移除并隐藏所有dock
  3. void removeAllDock();
  4. //显示dock窗口
  5. void showDock(const QList<int>& index = QList<int>());
  6. private:
  7. QList<QDockWidget*> m_docks; ///< 记录所有dockWidget的指针

 

CPP:


 
 
 
  1. MainWindow::MainWindow(QWidget *parent) :
  2. QMainWindow(parent),
  3. ui( new Ui::MainWindow)
QDockWidget是一个可以嵌入在QMainWindow中的可调整大小的窗口部件,可以用来创建多个可停靠的子窗口。嵌套布局是指在QDockWidget中使用其他布局管理器来管理内部子部件的摆放。 在使用QDockWidget创建子窗口时,我们可以通过setWidget方法将一个QWidget对象设置为QDockWidget的内部部件。这样我们就可以在QWidget中使用其他布局管理器来控制内部子部件的布局。 常用的布局管理器有QVBoxLayout、QHBoxLayout、QGridLayout等。我们可以在QWidget中使用这些布局管理器来实现各种复杂的子部件布局。 例如,我们可以通过QVBoxLayout来在QDockWidget嵌套垂直布局,然后再在垂直布局中添加其他QWidget子部件。具体的代码如下所示: ``` QDockWidget *dockWidget = new QDockWidget("Dock Widget", this); QWidget *widget = new QWidget(dockWidget); QVBoxLayout *layout = new QVBoxLayout(widget); QPushButton *button1 = new QPushButton("Button 1"); QPushButton *button2 = new QPushButton("Button 2"); QPushButton *button3 = new QPushButton("Button 3"); layout->addWidget(button1); layout->addWidget(button2); layout->addWidget(button3); dockWidget->setWidget(widget); addDockWidget(Qt::LeftDockWidgetArea, dockWidget); ``` 在这个例子中,我们创建了一个QDockWidget对象,并将其命名为"Dock Widget"。然后我们创建了一个QWidget对象并设置为QDockWidget的内部部件,最后我们创建了一个垂直布局管理器,并将三个QPushButton子部件添加到布局中。最后,我们将QWidget设置为QDockWidget的内部部件,并通过addDockWidget方法将QDockWidget添加到主窗口中。 通过这种方式,我们可以根据需求嵌套多个布局管理器,并灵活地控制子部件的布局方式,达到更加丰富和灵活的界面设计效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值