新建一个QMainWindow的空项目

(懒得看又臭又长直接到最后复制整段代码)

先新建一个QMainWindow的空项目,不使用.ui文件。
这时候mainwindow.h文件中没有成员变量

#pragma execution_character_set("utf-8")
#include "mainwindow.h"
#include <QDockWidget>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QTextEdit>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{QDockWidget *leftdock = new QDockWidget;leftdock->setWindowTitle("左布局窗口");QWidget* leftwidget = new QWidget();//左侧停靠窗口内部的widgetQVBoxLayout *leftlayout = new QVBoxLayout(leftwidget);//左侧停靠窗口widget中的布局器QTextEdit* text1 = new QTextEdit("这里是第一个窗口的内容");leftlayout->addWidget(text1);//左侧添加了一个控件leftdock->setWidget(leftwidget);this->addDockWidget(Qt::LeftDockWidgetArea, leftdock);//添加到左侧窗口,标志位Qt手册里找QDockWidget *rightdock1 = new QDockWidget;rightdock1->setWindowTitle("右侧布局一");QWidget* rightwidget1 = new QWidget();//左侧停靠窗口内部的widgetQVBoxLayout *rightlayout1 = new QVBoxLayout(rightwidget1);//左侧停靠窗口widget中的布局器QTextEdit* text2 = new QTextEdit("这里是第二个窗口的内容");rightlayout1->addWidget(text2);//左侧添加了一个控件rightdock1->setWidget(rightwidget1);this->addDockWidget(Qt::RightDockWidgetArea, rightdock1);//添加右侧窗口QDockWidget *rightdock2 = new QDockWidget;rightdock2->setWindowTitle("右侧布局二");QWidget* rightwidget2 = new QWidget();//左侧停靠窗口内部的widgetQVBoxLayout *rightlayout2 = new QVBoxLayout(rightwidget2);//左侧停靠窗口widget中的布局器QTextEdit* text3 = new QTextEdit("这里是第二个窗口的内容");rightlayout2->addWidget(text3);//左侧添加了一个控件rightdock2->setWidget(rightwidget2);this->addDockWidget(Qt::RightDockWidgetArea, rightdock2);//添加右侧窗口
}

运行结果应该是:这时候布局左右五五分,右边上下五五分
如下图:

注意:如果项目工程里有一个空的.ui文件,并且使用了.ui文件编辑出来的.h文件,设置了Ui再手写界面,放大主程序全屏,三个停靠窗口就不会是全屏的,就是三个窗口无法自适应大小。

解决方式一:左右中间加上一个临时的控件也行。不建议用,因为不利于设置窗口比例。

//    QWidget *tempWidget = new QWidget();
//    tempWidget->setFixedSize(0,0);
//    setCentralWidget(tempWidget);

设置停靠窗的比例

解决方式二:将三个QDockWidget类停靠窗临时变量提升至QMainWindow的成员变量,写在.h中
再重写resizeEvent()虚函数;
这时候mainwindow.h文件代码:

#include <QMainWindow>
#include <QDockWidget>
class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();protected:void resizeEvent(QResizeEvent *event);
private:QDockWidget *leftdock,*rightdock1,*rightdock2;
};

再废话一句,mainwindow.cpp中的三个new变量写法改这样,一定要给对象起名字哦,要不然后面没办法保存对象信息:

leftdock = new QDockWidget;
leftdock->setObjectName("leftdock");
//...
rightdock1 = new QDockWidget;
rightdock1->setObjectName("rightdock1");
//...
rightdock2 = new QDockWidget;
rightdock2->setObjectName("rightdock2");

mainwindow.cpp中的resizeEvent()函数的实现如下:


void MainWindow::resizeEvent(QResizeEvent *event)
{int width1 = int(this->width()*0.15);//左边的停靠窗宽是主界面的0.15倍int width2 = int(this->width()*0.85);//右边的停靠窗宽是主界面的0.85倍this->resizeDocks({rightdock1,rightdock2},{10,40},Qt::Vertical);//右侧上下布局一四分this->resizeDocks({leftdock,rightdock1,rightdock2},{width1,width2,width2},Qt::Horizontal);//左右水平布局015:0.85
}

运行结果如下:

QDockWidget停靠窗设置比例的部分写完了,再想加一个上方的菜单栏按钮

保存布局和恢复布局

mainwindow.h中添加以下代码:

private:QAction *save_layout,*restart_layout;QSettings *setting; //保存布局用的配置文件类,也可以用别的方式保存
public slots:void slot_save_layout();void slot_restart_layout();

mainwindow.cpp构造函数MainWindow::MainWindow中添加以下代码:

QMenuBar *menuBar = new QMenuBar(this);this->setMenuBar(menuBar);//设置菜单条QMenu *menu = this->menuBar()->addMenu("布局设置");save_layout = new QAction("保存布局");connect(save_layout,&QAction::triggered,this,&MainWindow::slot_save_layout);menu->addAction(save_layout);restart_layout = new QAction("恢复布局");connect(restart_layout,&QAction::triggered,this,&MainWindow::slot_restart_layout);menu->addAction(restart_layout);//exe执行程序旁边生成一个配置文件,用来寸界面布局QDockWidget类成员的信息,文件名随便取,格式随便写setting = new QSettings(QCoreApplication::applicationDirPath() + "/layout_config.txt",QSettings::IniFormat);setting->setIniCodec(QTextCodec::codecForName("utf-8"));//文件字节编码设置成utf-8

mainwindow.cpp最后中添加两个保存布局和恢复布局的槽函数:


void MainWindow::slot_save_layout()
{setting->setValue("LAYOUT/geometry",saveGeometry());//保存QDockWidget类成员的形状和大小setting->setValue("LAYOUT/state",saveState());//保存QDockWidget类成员的状态有的setting->sync();//立刻写入磁盘文件中
}void MainWindow::slot_restart_layout()
{//下面读取形状大小和读取状态可以选择一个读取,根据喜好可以注释一行restoreGeometry(setting->value("LAYOUT/geometry").toByteArray());restoreState(setting->value("LAYOUT/state").toByteArray());QList<QDockWidget* > dwList = this->findChildren<QDockWidget*>();foreach(QDockWidget* dw,dwList){restoreDockWidget(dw);}
}

左上角多了一个菜单条:

测试一下:先点把界面拖拽改变布局比例,点击保存布局菜单按钮,再将三个停靠窗随意拖拽或者独立出来,或者删除一个停靠窗,点上方的菜单栏的恢复布局,测试成功后,再试试恢复布局槽函数中,restoreGeometry()和restoreState()随机注销一个,再保存、恢复是什么效果。
如图:

整段的代码

mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QDockWidget>
#include <QAction>
#include <QSettings>
class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();protected:void resizeEvent(QResizeEvent *event);private:QDockWidget *leftdock,*rightdock1,*rightdock2;QAction *save_layout,*restart_layout;QSettings *setting;public slots:void slot_save_layout();void slot_restart_layout();};
#endif // MAINWINDOW_H

mainwindow.cpp:

#pragma execution_character_set("utf-8")
#include "mainwindow.h"
#include <QDockWidget>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QTextEdit>
#include <QMenuBar>
#include <QCoreApplication>
#include <QTextCodec>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{leftdock = new QDockWidget;leftdock->setObjectName("leftdock");leftdock->setWindowTitle("左窗口");QWidget* leftwidget = new QWidget();//左侧停靠窗口内部的widgetQVBoxLayout *leftlayout = new QVBoxLayout(leftwidget);//左侧停靠窗口widget中的布局器QTextEdit* text1 = new QTextEdit("这里是第一个窗口的内容");leftlayout->addWidget(text1);//左侧添加了一个控件leftdock->setWidget(leftwidget);this->addDockWidget(Qt::LeftDockWidgetArea, leftdock);//添加到左侧窗口,标志位Qt手册里找rightdock1 = new QDockWidget;rightdock1->setObjectName("rightdock1");rightdock1->setWindowTitle("右窗口一");QWidget* rightwidget1 = new QWidget();//左侧停靠窗口内部的widgetQVBoxLayout *rightlayout1 = new QVBoxLayout(rightwidget1);//左侧停靠窗口widget中的布局器QTextEdit* text2 = new QTextEdit("这里是第二个窗口的内容");rightlayout1->addWidget(text2);//左侧添加了一个控件rightdock1->setWidget(rightwidget1);this->addDockWidget(Qt::RightDockWidgetArea, rightdock1);//添加右侧窗口rightdock2 = new QDockWidget;rightdock2->setObjectName("rightdock2");rightdock2->setWindowTitle("右窗口二");QWidget* rightwidget2 = new QWidget();//左侧停靠窗口内部的widgetQVBoxLayout *rightlayout2 = new QVBoxLayout(rightwidget2);//左侧停靠窗口widget中的布局器QTextEdit* text3 = new QTextEdit("这里是第三个窗口的内容");rightlayout2->addWidget(text3);//左侧添加了一个控件rightdock2->setWidget(rightwidget2);this->addDockWidget(Qt::RightDockWidgetArea, rightdock2);//添加右侧窗口QMenuBar *menuBar = new QMenuBar(this);this->setMenuBar(menuBar);//设置菜单条QMenu *menu = this->menuBar()->addMenu("布局设置");save_layout = new QAction("保存布局");connect(save_layout,&QAction::triggered,this,&MainWindow::slot_save_layout);menu->addAction(save_layout);restart_layout = new QAction("恢复布局");connect(restart_layout,&QAction::triggered,this,&MainWindow::slot_restart_layout);menu->addAction(restart_layout);//exe执行程序旁边生成一个配置文件,用来寸界面布局QDockWidget类成员的信息,文件名随便取,格式随便写setting = new QSettings(QCoreApplication::applicationDirPath() + "/layout_config.txt",QSettings::IniFormat);setting->setIniCodec(QTextCodec::codecForName("utf-8"));//文件字节编码设置成utf-8
}MainWindow::~MainWindow()
{}void MainWindow::resizeEvent(QResizeEvent *event)
{int width1 = int(this->width()*0.15);//左边的停靠窗宽是主界面的0.15倍int width2 = int(this->width()*0.85);//右边的停靠窗宽是主界面的0.85倍this->resizeDocks({rightdock1,rightdock2},{10,40},Qt::Vertical);//右侧上下布局一四分this->resizeDocks({leftdock,rightdock1,rightdock2},{width1,width2,width2},Qt::Horizontal);//左右水平布局015:0.85
}void MainWindow::slot_save_layout()
{setting->setValue("LAYOUT/geometry",saveGeometry());//保存QDockWidget类成员的形状和大小setting->setValue("LAYOUT/state",saveState());//保存QDockWidget类成员的状态有的setting->sync();//立刻写入磁盘文件中
}void MainWindow::slot_restart_layout()
{//下面读取形状大小和读取状态可以选择一个读取,根据喜好可以注释一行restoreGeometry(setting->value("LAYOUT/geometry").toByteArray());restoreState(setting->value("LAYOUT/state").toByteArray());QList<QDockWidget* > dwList = this->findChildren<QDockWidget*>();foreach(QDockWidget* dw,dwList){restoreDockWidget(dw);}
}

Qt中QDockWidget停靠窗之设置布局比例,保存布局和恢复布局相关推荐

  1. Qt中QLabel的背景图片设置问题

    在Qt开发的过程中,经常会遇到设置Label的背景图片问题,通常可以有一下两种方法设置: 方法1:通过setScaleContents来设置(有时候会出现svg图片无法自适应label大小的问题) Q ...

  2. qt中根据数据解析的结果动态的创建控件并布局

    引言 有时候程序中的控件的个数是无法预测的,当程序启动时,根据解析的数据动态的创建n行m列的控件,并为其布局.下面记录一下动态创建控件,并布局. 运行效果 示例 此示例主要是从json配置文件中读取参 ...

  3. 在Qt中如何给菜单栏选项设置图标

    首先在UI设计器里面给菜单项添加一些选项,如下: 然后将你要设置的图片添加到Qt资源文件,若不知道怎么添加资源文件可以看下我的这篇文章: 如何添加资源文件 将资源文件添加好后,点击Action Edi ...

  4. Simulink中示波器图窗编辑设置

    在MATLAB/Smulink中使用示波器出图,很难对坐标区进行编辑. 如下图所示,菜单栏只有一些基本的选项,基本没有什么其他可编辑选项! 这时候就需要在MATLAB主界面输入以下代码,菜单栏的选项就 ...

  5. 13.QT中控制台程序console相关设置

    1 修改控制台标题  system("title  xxx"); 2  修改控制台背景颜色   system("color F0"); 3   颜色说明 4   ...

  6. qt linux实现鼠标位置自动移动,【已解决】qt中鼠标能显示但是无法移动

    [问题] 在完成了Linux kernel中的对应的一个模拟鼠标的输入设备(input device)easypoint驱动后,验证了该驱动可以正常工作了,输入 cat /dev/input/even ...

  7. QT界面:QDockWidget停靠窗口使用小结

    QDockWidget停靠窗口 Qt构建停靠窗口使用的是QDockWidget类. 窗口特性 停靠窗口特性可以通过setFeatures(QDockWidget::AllDockWidgetFeatu ...

  8. QT使用html改变字体颜色,QT中设置字体和更改字体颜色

    QT中设置字体和更改字体颜色 对一个文本框lineEdit设置字体,首先我建了一个按钮setFontButton用来设置 并定义了它的相应函数setFont,将setFontButton添加到布局中, ...

  9. QT中设置字体和更改字体颜色

    QT中设置字体和更改字体颜色 对一个文本框lineEdit设置字体,首先我建了一个按钮setFontButton用来设置 并定义了它的相应函数setFont,将setFontButton添加到布局中, ...

最新文章

  1. C#量转换为汉字表达
  2. 云计算技术 — 容灾备份技术
  3. 一元享移动怎么样_移动大王卡千万别买!!!
  4. POJ1236 强连通 (缩点后度数的应用)
  5. 双11还是那个双11,双12却早已不是那个双12
  6. 如何激活React的跟踪模式和打开日志记录
  7. 2019年技术盘点容器篇(二):听腾讯云讲讲踏入成熟期的容器技术 | 程序员硬核评测...
  8. WebApi实现验证授权Token,WebApi生成文档等
  9. Extended Twin Composite Number 思维题
  10. linun开启oracle监听,Linux下配置Oracle监听器
  11. python学习第25天
  12. Win7 maven安装及配置
  13. hexo之Volantis主题美化
  14. 计算机系统集成过程检查规范,系统集成项目验收规范.docx
  15. 卜若的代码笔记-机器学习基础-UCI数据库简介与Iris数据集分析
  16. Opencv,imread()读取BGR格式文件转换与RGB格式的相互转换
  17. 体脂的计算Java_简单测试体脂率的两种经验公式
  18. c语言工业设计中的案例,工业设计中CMF为什么这么重要?看看设计案例就知道了!...
  19. 时间转换数字与日期互转
  20. 大型建筑公司如何实现数字化转型

热门文章

  1. Zabbix磁盘IO监控
  2. linux NFS 服务配置
  3. Dicom文件转mhd,raw文件格式
  4. 2021湖北天门高考理科成绩查询,2021年天门市高考状元名单资料,今年天门市高考状元多少分...
  5. 医学网android课程,医学云课堂
  6. p5js码绘笔刷如何嵌入到Web前端(python+Django框架)
  7. 图数据库:Nebula Graph【开源的分布式图数据库】
  8. int 为什么是2147483647_INT_MAX (2147483647) 和INT_MIN (-2147483648)溢出
  9. 内嵌于球的等边三棱柱
  10. 《程序员》2012年5期精彩内容:云计算!