QT_QT布局常用类QSplitter窗口分割类与QDockWidget窗口停靠类
文章目录QT_QT布局常用类QSplitter类与QDockWidget类QSplitter类(窗口分割)基本介绍核心功能与常用 API使用案例QDockWidget(停靠窗口)基本介绍核心功能与常用APIide经典布局案例**效果** QT_QT布局常用类QSplitter类与QDockWidget类QSplitter类(窗口分割)QSplitter 是 Qt 中用于实现可拖拽分割窗口的布局组件允许用户通过拖动分隔条来调整子控件的大小。基本介绍QSplitter 继承自 QFrame它可以将多个子控件Widget按水平或垂直方向排列并在控件之间插入一个可拖动的分隔条Splitter Handle用户可以拖动分隔条来动态调整各子控件所占的空间比例。头文件#includeQSplitter核心功能与常用 API创建与方向// 水平分割子控件从左到右排列QSplitter*splitternewQSplitter(Qt::Horizontal,parent);// 垂直分割子控件从上到下排列QSplitter*splitternewQSplitter(Qt::Vertical,parent);// 动态修改方向splitter-setOrientation(Qt::Vertical);添加子控件QTextEdit*editor1newQTextEdit;QTextEdit*editor2newQTextEdit;splitter-addWidget(editor1);splitter-addWidget(editor2);设置初始大小比例// 设置各子控件的初始宽度或高度比例splitter-setSizes(QListint()200300);// 获取当前各子控件的大小QListintsizessplitter-sizes();设置拉伸因子Stretch Factor// 设置索引为0的子控件拉伸因子为1索引为1的为2// 当窗口拉伸时第二个控件会获得更多额外空间splitter-setStretchFactor(0,1);splitter-setStretchFactor(1,2);设置子控件可折叠// 双击分隔条时子控件是否可折叠为0splitter-setChildrenCollapsible(false);// 禁止折叠默认true// 针对特定子控件设置splitter-setCollapsible(0,false);// 索引0的子控件不可折叠嵌套使用多级分割QSplitter 支持嵌套可以实现复杂的分割布局*// 主分割器水平QSplitter*mainSplitternewQSplitter(Qt::Horizontal);// 左侧树形控件QTreeWidget*treenewQTreeWidget;mainSplitter-addWidget(tree);// 右侧垂直分割器QSplitter*rightSplitternewQSplitter(Qt::Vertical);QTextEdit*editornewQTextEdit;QTextBrowser*previewnewQTextBrowser;rightSplitter-addWidget(editor);rightSplitter-addWidget(preview);mainSplitter-addWidget(rightSplitter);自定义分割条样式// 设置分隔条宽度splitter-setHandleWidth(5);// 通过样式表自定义外观splitter-setStyleSheet(QSplitter::handle { background-color: #cccccc; width: 2px;// 水平分割时 height: 2px;// 垂直分割时}QSplitter::handle:hover { background-color: #4a90d9;});信号与槽QSplitter 提供了以下常用信号// 分隔条被拖动时发射参数为各子控件的新尺寸列表connect(splitter,QSplitter::splitterMoved,[](intpos,intindex){qDebug()分隔条index移动到位置pos;使用案例#includemainwindow.h#includeQSplitter#includeQTextEditMainWindow::MainWindow(QWidget*parent):QMainWindow(parent){// 1. 拆分窗口分裂窗口布局QSplitter*spMainWindownewQSplitter(Qt::Horizontal,0);QTextEdit*textEditMainnewQTextEdit(左边主窗口,spMainWindow);// 2. 拆分右边部分窗口QSplitter*spRightnewQSplitter(Qt::Vertical,spMainWindow);QTextEdit*textEditUpnewQTextEdit(右边上窗口,spRight);QTextEdit*textEditDownnewQTextEdit(右边下窗口,spRight);// 3.QSplitter*sptestnewQSplitter(Qt::Vertical,spRight);QTextEdit*texteidttestnewQTextEdit(abcdQT开发,spRight);spMainWindow-setWindowTitle(Splitter类才分窗口测试);spMainWindow-show();}MainWindow::~MainWindow(){}效果QDockWidget(停靠窗口)QDockWidget 是 Qt 中用于创建可停靠、可浮动、可关闭的面板组件常用于 IDE、图像处理软件等需要灵活布局的桌面应用。基本介绍QDockWidget 继承自 QWidget它可以停靠在主窗口的四个边缘上、下、左、右浮动为独立窗口拖拽到不同位置关闭/隐藏并可通过菜单重新显示头文件#includeQDockWidget核心功能与常用API基本用法// 创建主窗口QMainWindow*mainWindownewQMainWindow;// 创建 DockWidgetQDockWidget*docknewQDockWidget(属性面板,mainWindow);dock-setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);// 设置 Dock 的内容QTreeWidget*treenewQTreeWidget;dock-setWidget(tree);// 将 Dock 添加到主窗口mainWindow-addDockWidget(Qt::LeftDockWidgetArea,dock);注意QDockWidget 必须作为 QMainWindow 的子控件使用不能在普通 QWidget 中使用。停靠区域常量位置Qt::LeftDockWidgetArea左侧Qt::RightDockWidgetArea右侧Qt::TopDockWidgetArea顶部Qt::BottomDockWidgetArea底部功能特性设置// 禁止浮动只能停靠不能拖出为独立窗口dock-setFeatures(dock-features()~QDockWidget::DockWidgetFloatable);// 禁止关闭dock-setFeatures(dock-features()~QDockWidget::DockWidgetClosable);// 禁止移动dock-setFeatures(dock-features()~QDockWidget::DockWidgetMovable);// 一次性设置多个特性dock-setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable);// 禁止所有特性固定不可操作dock-setFeatures(QDockWidget::NoDockWidgetFeatures);多个 DockWidget 的布局控制选项卡化Tab 页签模式QDockWidget*dock1newQDockWidget(面板1,mainWindow);QDockWidget*dock2newQDockWidget(面板2,mainWindow);mainWindow-addDockWidget(Qt::LeftDockWidgetArea,dock1);mainWindow-addDockWidget(Qt::LeftDockWidgetArea,dock2);// 将两个 Dock 以选项卡方式组合mainWindow-tabifyDockWidget(dock1,dock2);分割 DockWidget// 在 dock1 的右侧分割出 dock2 的空间mainWindow-splitDockWidget(dock1,dock2,Qt::Vertical);嵌套 DockWidget通过 QSplitterQDockWidget 本身不支持直接嵌套但可以通过 QSplitter 间接实现QDockWidget*docknewQDockWidget(组合面板,mainWindow);QSplitter*splitternewQSplitter(Qt::Vertical);splitter-addWidget(newQTextEdit);splitter-addWidget(newQTreeWidget);dock-setWidget(splitter);mainWindow-addDockWidget(Qt::BottomDockWidgetArea,dock);常用信号// 关闭按钮被点击connect(dock,QDockWidget::visibilityChanged,[](boolvisible){// visible 为 false 时表示被关闭});// 顶层状态变化浮动/停靠切换时触发connect(dock,QDockWidget::topLevelChanged,[](booltopLevel){qDebug()是否浮动:topLevel;});// 停靠区域变化connect(dock,QDockWidget::dockLocationChanged,[](Qt::DockWidgetArea area){qDebug()新停靠区域:area;});ide经典布局案例mainwindow.h代码#ifndefMAINWINDOW_H#defineMAINWINDOW_H#includeQMainWindow#includeQDockWidgetclassMainWindow:publicQMainWindow{Q_OBJECTpublic:MainWindow(QWidget*parentnullptr);~MainWindow();private:voidDockWidgetFunc();QDockWidget*dw1;// 项目面板QDockWidget*dw2;// 属性面板QDockWidget*dw3;// 输出面板};#endif// MAINWINDOW_Hmainwindow.cpp代码#includemainwindow.h#includeQTextEdit#includeQDockWidget#includeQTreeWidget#includeQMenuBar#includeQMenu#includeQAction#includeQSplitterMainWindow::MainWindow(QWidget*parent):QMainWindow(parent){DockWidgetFunc();}MainWindow::~MainWindow(){}voidMainWindow::DockWidgetFunc(){setWindowTitle(QDockWidget 停靠窗口测试);resize(800,600);// 中心区域主编辑器 QTextEdit*centralEditornewQTextEdit;centralEditor-setPlaceholderText(这里是主编辑区域...);setCentralWidget(centralEditor);// 停靠窗口1左侧项目树 dw1newQDockWidget(项目,this);dw1-setFeatures(QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable);dw1-setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);QTreeWidget*projectTreenewQTreeWidget;projectTree-setHeaderLabel(项目文件);// 添加示例节点QTreeWidgetItem*srcItemnewQTreeWidgetItem(projectTree,QStringList(src));newQTreeWidgetItem(srcItem,QStringList(main.cpp));newQTreeWidgetItem(srcItem,QStringList(mainwindow.cpp));newQTreeWidgetItem(srcItem,QStringList(mainwindow.h));QTreeWidgetItem*resItemnewQTreeWidgetItem(projectTree,QStringList(resources));newQTreeWidgetItem(resItem,QStringList(icon.png));projectTree-expandAll();dw1-setWidget(projectTree);addDockWidget(Qt::LeftDockWidgetArea,dw1);// 停靠窗口2右侧属性面板 dw2newQDockWidget(属性,this);dw2-setFeatures(QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable);dw2-setAllowedAreas(Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea);QTreeWidget*propTreenewQTreeWidget;propTree-setColumnCount(2);propTree-setHeaderLabels(QStringList()属性值);newQTreeWidgetItem(propTree,QStringList()objectNamecentralWidget);newQTreeWidgetItem(propTree,QStringList()geometry0,0,800,600);newQTreeWidgetItem(propTree,QStringList()windowTitleMainWindow);newQTreeWidgetItem(propTree,QStringList()enabledtrue);dw2-setWidget(propTree);addDockWidget(Qt::RightDockWidgetArea,dw2);// 停靠窗口3底部输出窗口 dw3newQDockWidget(输出,this);dw3-setFeatures(QDockWidget::DockWidgetMovable|QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable);dw3-setAllowedAreas(Qt::BottomDockWidgetArea|Qt::TopDockWidgetArea);QTextEdit*outputEditnewQTextEdit;outputEdit-setReadOnly(true);outputEdit-append([信息] 程序启动成功);outputEdit-append([信息] 加载项目完成);outputEdit-append([警告] 未找到配置文件使用默认设置);dw3-setWidget(outputEdit);addDockWidget(Qt::BottomDockWidgetArea,dw3);// 菜单栏视图菜单控制 Dock 显隐 QMenu*viewMenumenuBar()-addMenu(视图(V));viewMenu-addAction(dw1-toggleViewAction());// 项目面板viewMenu-addAction(dw2-toggleViewAction());// 属性面板viewMenu-addAction(dw3-toggleViewAction());// 输出面板}效果end