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

PyQt5自定义QMainWindow无法显示标题与菜单栏的解决方法

问题解决:PyQt5 QMainWindow同时显示标题、菜单和StackedLayout

你的问题核心在于QMainWindow的结构使用错误,以及Ui类的继承设计导致了独立窗口的产生。以下是具体问题分析和修复方案:

问题根源

  1. Ui类继承了QWidget,导致它本身是一个独立的窗口部件,和MainWindow实例是两个不同的窗口对象,所以取消window.show()注释会弹出两个窗口。
  2. QMainWindow要求所有自定义内容必须放在**中央部件(Central Widget)**中,你没有将StackedLayout绑定到主窗口的中央部件,导致内容无法显示。
  3. 菜单应该绑定到QMainWindow实例,而非Ui的QWidget实例,否则菜单不会显示在主窗口上。

修复方案(推荐)

调整Ui类为纯界面构建类,不再继承QWidget,专注于将界面元素挂载到MainWindow上:

import sys
from PyQt5.QtCore import QRect, Qt
from PyQt5.QtWidgets import (QApplication, QMainWindow, QPushButton, QAction,
                             QVBoxLayout, QLabel, QWidget, QStackedLayout)


class Ui:
    def setupUi(self, Main):
        Main.setObjectName("Main")
        Main.setFixedSize(900, 500)
        self.width = 900
        self.height = 500

        # 给MainWindow创建顶部菜单
        menuBar = Main.menuBar()
        fileMenu = menuBar.addMenu('&File')

        # 创建中央部件,作为StackedLayout的载体
        central_widget = QWidget(Main)
        Main.setCentralWidget(central_widget)

        # 初始化StackedLayout并绑定到中央部件
        self.menu = QStackedLayout(central_widget)

        self.mainMenu = QWidget()
        self.nextMenu = QWidget()

        self.mainMenuUi()
        self.nextMenuUi()

        self.menu.addWidget(self.mainMenu)
        self.menu.addWidget(self.nextMenu)

    def mainMenuUi(self):
        self.mainMenu.setFixedSize(self.width, self.height)
        self.mainMenuText = QLabel("welcome view", self.mainMenu)
        self.mainMenuText.setGeometry(QRect(30, 120, 480, 200))
        self.mainMenuText.setStyleSheet("font: 14pt Century Gothic")
        self.mainMenuText.setAlignment(Qt.AlignLeading | Qt.AlignLeft | Qt.AlignTop)
        self.btn2 = QPushButton("Next", self.mainMenu)

    def nextMenuUi(self):
        self.nextMenu_layout = QVBoxLayout()
        self.nextMenu.setFixedSize(self.width, self.height)
        self.btn1 = QPushButton("Back")
        self.nextMenu_layout.addWidget(self.btn1)
        self.nextMenu.setLayout(self.nextMenu_layout)


class MainWindow(QMainWindow, Ui):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("My App window title")
        self.setupUi(self)

        self.btn1.clicked.connect(self.menuWindow)
        self.btn2.clicked.connect(self.menuWindow2)

    def menuWindow(self):
        self.menu.setCurrentIndex(0)

    def menuWindow2(self):
        self.menu.setCurrentIndex(1)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

关键修改点

  • 移除Ui类的QWidget继承,避免产生独立窗口部件。
  • 为MainWindow创建central_widget,并通过setCentralWidget设置为窗口的核心承载部件,这是QMainWindow的强制要求。
  • 将StackedLayout直接绑定到central_widget,确保布局内容显示在主窗口内部。
  • 菜单调用改为Main.menuBar(),让菜单归属到MainWindow实例,正确显示在窗口顶部。
  • 恢复window.show()调用,现在只会弹出一个包含标题、菜单和StackedLayout内容的主窗口。

内容的提问来源于stack exchange,提问作者A.G.Progm.Enthusiast

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 08:33:10