0


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

新建一个QMainWindow的空项目

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

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

  1. #pragmaexecution_character_set("utf-8")#include"mainwindow.h"#include<QDockWidget>#include<QVBoxLayout>#include<QHBoxLayout>#include<QTextEdit>MainWindow::MainWindow(QWidget *parent):QMainWindow(parent){
  2. QDockWidget *leftdock =new QDockWidget;
  3. leftdock->setWindowTitle("左布局窗口");
  4. QWidget* leftwidget =newQWidget();//左侧停靠窗口内部的widget
  5. QVBoxLayout *leftlayout =newQVBoxLayout(leftwidget);//左侧停靠窗口widget中的布局器
  6. QTextEdit* text1 =newQTextEdit("这里是第一个窗口的内容");
  7. leftlayout->addWidget(text1);//左侧添加了一个控件
  8. leftdock->setWidget(leftwidget);this->addDockWidget(Qt::LeftDockWidgetArea, leftdock);//添加到左侧窗口,标志位Qt手册里找
  9. QDockWidget *rightdock1 =new QDockWidget;
  10. rightdock1->setWindowTitle("右侧布局一");
  11. QWidget* rightwidget1 =newQWidget();//左侧停靠窗口内部的widget
  12. QVBoxLayout *rightlayout1 =newQVBoxLayout(rightwidget1);//左侧停靠窗口widget中的布局器
  13. QTextEdit* text2 =newQTextEdit("这里是第二个窗口的内容");
  14. rightlayout1->addWidget(text2);//左侧添加了一个控件
  15. rightdock1->setWidget(rightwidget1);this->addDockWidget(Qt::RightDockWidgetArea, rightdock1);//添加右侧窗口
  16. QDockWidget *rightdock2 =new QDockWidget;
  17. rightdock2->setWindowTitle("右侧布局二");
  18. QWidget* rightwidget2 =newQWidget();//左侧停靠窗口内部的widget
  19. QVBoxLayout *rightlayout2 =newQVBoxLayout(rightwidget2);//左侧停靠窗口widget中的布局器
  20. QTextEdit* text3 =newQTextEdit("这里是第二个窗口的内容");
  21. rightlayout2->addWidget(text3);//左侧添加了一个控件
  22. rightdock2->setWidget(rightwidget2);this->addDockWidget(Qt::RightDockWidgetArea, rightdock2);//添加右侧窗口}

运行结果应该是:这时候布局左右五五分,右边上下五五分
如下图:
这时候布局左右五五分,右边上下五五分
注意:如果项目工程里有一个空的.ui文件,并且使用了.ui文件编辑出来的.h文件,设置了Ui再手写界面,放大主程序全屏,三个停靠窗口就不会是全屏的,就是三个窗口无法自适应大小。

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

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

设置停靠窗的比例

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

  1. #include<QMainWindow>#include<QDockWidget>classMainWindow:publicQMainWindow{
  2. Q_OBJECT
  3. public:MainWindow(QWidget *parent =nullptr);~MainWindow();protected:voidresizeEvent(QResizeEvent *event);private:
  4. QDockWidget *leftdock,*rightdock1,*rightdock2;};

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

  1. leftdock =new QDockWidget;
  2. leftdock->setObjectName("leftdock");//...
  3. rightdock1 =new QDockWidget;
  4. rightdock1->setObjectName("rightdock1");//...
  5. rightdock2 =new QDockWidget;
  6. rightdock2->setObjectName("rightdock2");

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

  1. voidMainWindow::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中添加以下代码:

  1. private:
  2. QAction *save_layout,*restart_layout;
  3. QSettings *setting;//保存布局用的配置文件类,也可以用别的方式保存public slots:voidslot_save_layout();voidslot_restart_layout();

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

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

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

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

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

整段的代码

mainwindow.h:

  1. #ifndefMAINWINDOW_H#defineMAINWINDOW_H#include<QMainWindow>#include<QDockWidget>#include<QAction>#include<QSettings>classMainWindow:publicQMainWindow{
  2. Q_OBJECT
  3. public:MainWindow(QWidget *parent =nullptr);~MainWindow();protected:voidresizeEvent(QResizeEvent *event);private:
  4. QDockWidget *leftdock,*rightdock1,*rightdock2;
  5. QAction *save_layout,*restart_layout;
  6. QSettings *setting;public slots:voidslot_save_layout();voidslot_restart_layout();};#endif// MAINWINDOW_H

mainwindow.cpp:

  1. #pragmaexecution_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){
  2. leftdock =new QDockWidget;
  3. leftdock->setObjectName("leftdock");
  4. leftdock->setWindowTitle("左窗口");
  5. QWidget* leftwidget =newQWidget();//左侧停靠窗口内部的widget
  6. QVBoxLayout *leftlayout =newQVBoxLayout(leftwidget);//左侧停靠窗口widget中的布局器
  7. QTextEdit* text1 =newQTextEdit("这里是第一个窗口的内容");
  8. leftlayout->addWidget(text1);//左侧添加了一个控件
  9. leftdock->setWidget(leftwidget);this->addDockWidget(Qt::LeftDockWidgetArea, leftdock);//添加到左侧窗口,标志位Qt手册里找
  10. rightdock1 =new QDockWidget;
  11. rightdock1->setObjectName("rightdock1");
  12. rightdock1->setWindowTitle("右窗口一");
  13. QWidget* rightwidget1 =newQWidget();//左侧停靠窗口内部的widget
  14. QVBoxLayout *rightlayout1 =newQVBoxLayout(rightwidget1);//左侧停靠窗口widget中的布局器
  15. QTextEdit* text2 =newQTextEdit("这里是第二个窗口的内容");
  16. rightlayout1->addWidget(text2);//左侧添加了一个控件
  17. rightdock1->setWidget(rightwidget1);this->addDockWidget(Qt::RightDockWidgetArea, rightdock1);//添加右侧窗口
  18. rightdock2 =new QDockWidget;
  19. rightdock2->setObjectName("rightdock2");
  20. rightdock2->setWindowTitle("右窗口二");
  21. QWidget* rightwidget2 =newQWidget();//左侧停靠窗口内部的widget
  22. QVBoxLayout *rightlayout2 =newQVBoxLayout(rightwidget2);//左侧停靠窗口widget中的布局器
  23. QTextEdit* text3 =newQTextEdit("这里是第三个窗口的内容");
  24. rightlayout2->addWidget(text3);//左侧添加了一个控件
  25. rightdock2->setWidget(rightwidget2);this->addDockWidget(Qt::RightDockWidgetArea, rightdock2);//添加右侧窗口
  26. QMenuBar *menuBar =newQMenuBar(this);this->setMenuBar(menuBar);//设置菜单条
  27. QMenu *menu =this->menuBar()->addMenu("布局设置");
  28. save_layout =newQAction("保存布局");connect(save_layout,&QAction::triggered,this,&MainWindow::slot_save_layout);
  29. menu->addAction(save_layout);
  30. restart_layout =newQAction("恢复布局");connect(restart_layout,&QAction::triggered,this,&MainWindow::slot_restart_layout);
  31. menu->addAction(restart_layout);//exe执行程序旁边生成一个配置文件,用来寸界面布局QDockWidget类成员的信息,文件名随便取,格式随便写
  32. setting =newQSettings(QCoreApplication::applicationDirPath()+"/layout_config.txt",QSettings::IniFormat);
  33. setting->setIniCodec(QTextCodec::codecForName("utf-8"));//文件字节编码设置成utf-8}MainWindow::~MainWindow(){}voidMainWindow::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}voidMainWindow::slot_save_layout(){
  34. setting->setValue("LAYOUT/geometry",saveGeometry());//保存QDockWidget类成员的形状和大小
  35. setting->setValue("LAYOUT/state",saveState());//保存QDockWidget类成员的状态有的
  36. setting->sync();//立刻写入磁盘文件中}voidMainWindow::slot_restart_layout(){//下面读取形状大小和读取状态可以选择一个读取,根据喜好可以注释一行restoreGeometry(setting->value("LAYOUT/geometry").toByteArray());restoreState(setting->value("LAYOUT/state").toByteArray());
  37. QList<QDockWidget*> dwList =this->findChildren<QDockWidget*>();foreach(QDockWidget* dw,dwList){restoreDockWidget(dw);}}
标签: qt ui

本文转载自: https://blog.csdn.net/qq_40944337/article/details/124962899
版权归原作者 黄猿欲度愁攀援 所有, 如有侵权,请联系我们删除。

“Qt中QDockWidget停靠窗之设置布局比例,保存布局和恢复布局”的评论:

还没有评论