You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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无法全屏:

  1. 重复将QSplitter添加到布局,导致布局逻辑混乱
  2. 未将子控件正确加入QSplitter,分割器没有可管理的内容
  3. 使用QDialog作为布局子控件(QDialog是弹窗控件,不适合嵌入常规布局)
  4. 布局未设置拉伸因子,控件无法随窗口缩放
  5. 存在不必要的最小尺寸限制,阻碍窗口全屏适配

修正后的代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 21:52:58