如何在PyQt6中正确使用QSplitter并实现全屏显示?
PyQt6中QSplitter无法全屏显示的解决方法
问题描述
我在PyQt6中使用QSplitter时无法实现全屏分割布局,当前运行代码后布局无法占满窗口,请问如何调整才能让QSplitter全屏显示?
用户提供的原始代码:
import sys from widgets.tabWidget import TabWidgets from PyQt6 import QtCore from PyQt6.QtCore import Qt from PyQt6.QtWidgets import QApplication, QMainWindow, QToolBar, QStyle, QVBoxLayout from PyQt6.QtGui import QIcon, QAction class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle('title') self.setGeometry(100, 100, 500, 400), self.tab_widget = TabWidgets(self) self.tab_widget.setMinimumSize(800, 500) self.setCentralWidget(self.tab_widget) self.toolbar() self.actions() self.menubar() def menubar(self): menuBar = self.menuBar() fileMenu = menuBar.addMenu('File') fileMenu.addAction(self.newAction) def actions(self): self.newAction = QAction(self) self.newAction.setText("new") def toolbar(self): top_tool_bar = QToolBar('main_tools', self) self.addToolBar(Qt.ToolBarArea.TopToolBarArea, top_tool_bar) top_tool_bar.addAction(QIcon('image/add-icon1.png'), 'open new data') top_tool_bar.setIconSize(QtCore.QSize(35, 35)) class TabWidgets(QWidget): def __init__(self, parent): super(QWidget, self).__init__() page_layout = QVBoxLayout() map_layout = QHBoxLayout() self.tabs = QTabWidget() self.tabs.setMaximumHeight(80) self.tab1 = QWidget() self.tabs.addTab(self.tab1, 'main tools') self.tab1.layout = QVBoxLayout(self) self.tab1.setLayout(self.tab1.layout) self.map = QSplitter(self) self.toc = QSplitter(self) map_layout.addWidget(self.toc) map_layout.addWidget(self.map) page_layout.addWidget(self.tabs) page_layout.addLayout(map_layout) self.TOC(self.map) self.Map(self.map) page_layout.addWidget(self.map) self.setLayout(page_layout) def TOC(self, parent): toc_content = QtWidgets.QDialog(parent) return toc_content def Map(self, parent): toc_content = QtWidgets.QTabWidget(parent) app = QApplication(sys.argv) window = MainWindow() window.show() app.exec()
问题分析
原始代码存在几个核心问题导致QSplitter无法全屏:
- 重复将QSplitter添加到布局,导致布局逻辑混乱
- 未将子控件正确加入QSplitter,分割器没有可管理的内容
- 使用QDialog作为布局子控件(QDialog是弹窗控件,不适合嵌入常规布局)
- 布局未设置拉伸因子,控件无法随窗口缩放
- 存在不必要的最小尺寸限制,阻碍窗口全屏适配
修正后的代码
import sys from PyQt6 import QtCore, QtWidgets from PyQt6.QtCore import Qt from PyQt6.QtWidgets import (QApplication, QMainWindow, QToolBar, QVBoxLayout, QSplitter, QTabWidget, QWidget) from PyQt6.QtGui import QIcon, QAction class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle('全屏分割布局') self.setGeometry(100, 100, 800, 600) self.tab_widget = TabWidgets(self) self.setCentralWidget(self.tab_widget) self.toolbar() self.actions() self.menubar() def menubar(self): menuBar = self.menuBar() fileMenu = menuBar.addMenu('文件') fileMenu.addAction(self.newAction) def actions(self): self.newAction = QAction(self) self.newAction.setText("新建") def toolbar(self): top_tool_bar = QToolBar('主工具栏', self) self.addToolBar(Qt.ToolBarArea.TopToolBarArea, top_tool_bar) # 用系统图标替代本地图标,避免路径问题 top_tool_bar.addAction(QIcon.fromTheme('document-new'), '打开新数据') top_tool_bar.setIconSize(QtCore.QSize(35, 35)) class TabWidgets(QWidget): def __init__(self, parent): super().__init__(parent) # 主布局直接绑定当前窗口 page_layout = QVBoxLayout(self) page_layout.setSpacing(0) page_layout.setContentsMargins(0, 0, 0, 0) # 顶部标签栏 self.tabs = QTabWidget() self.tabs.setMaximumHeight(80) self.tab1 = QWidget() self.tabs.addTab(self.tab1, '主工具') self.tab1.setLayout(QVBoxLayout()) # 创建横向分割器,作为核心布局容器 main_splitter = QSplitter(Qt.Orientation.Horizontal) # 添加左侧TOC控件 toc_widget = self.TOC() main_splitter.addWidget(toc_widget) # 添加右侧Map控件 map_widget = self.Map() main_splitter.addWidget(map_widget) # 设置拉伸因子,控制两侧缩放比例(可按需调整) main_splitter.setStretchFactor(0, 1) main_splitter.setStretchFactor(1, 3) # 组装整体布局 page_layout.addWidget(self.tabs) page_layout.addWidget(main_splitter) def TOC(self): # 用QWidget替代QDialog,作为常规布局子控件 toc_content = QWidget() toc_content.setStyleSheet("background-color: #f0f0f0;") return toc_content def Map(self): map_content = QTabWidget() map_content.addTab(QWidget(), '地图1') map_content.setStyleSheet("background-color: #e0e0e0;") return map_content if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec())
关键修改说明
- 移除重复的布局添加操作,确保QSplitter只被加入一次布局
- 将QDialog替换为QWidget,保证控件能正常嵌入布局
- 通过
setStretchFactor设置分割器两侧的缩放比例,让控件随窗口自动适配 - 清除布局的边距和间距,让控件完全填满窗口
- 移除不必要的最小尺寸限制,允许窗口自由缩放至全屏
内容的提问来源于stack exchange,提问作者arc py
相关产品推荐
相关产品推荐

