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

PyQt5继承QMainWindow按钮不显示,继承QWidget正常的原因?

问题原因及解决方法

QMainWindow和QWidget的布局逻辑存在差异:QMainWindow有固定的窗口结构,自带菜单栏、工具栏、状态栏等区域,不能直接调用setLayout()给主窗口设置布局,所有自定义控件都需要放到它的**中央部件(Central Widget)**中。

修改后的代码

from PyQt5.QtWidgets import QMainWindow, QFormLayout, QPushButton, QApplication, QWidget
import sys


class Menu(QMainWindow):
    """
    Create menu object
    """

    def __init__(self, parent=None):
        """
        Initialize main menu
        """
        super().__init__(parent)
        self.file = None
        self.fields_create()
        self.create_table()

    def fields_create(self):
        """
        Create buttons and LineEdits
        """
        # Settings Button
        self.settings_btn = QPushButton()
        self.settings_btn.setText("Settings")
        self.settings_btn.clicked.connect(self.settings_click)

    def create_table(self):
        """
        create and display table
        """
        # 创建中央部件作为容器
        central_widget = QWidget()
        self.flo = QFormLayout()
        self.flo.addRow(self.settings_btn)
        # 将布局设置给中央部件
        central_widget.setLayout(self.flo)
        # 把中央部件设置给主窗口
        self.setCentralWidget(central_widget)

    def settings_click(self):
        print("clicked")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = Menu()
    win.show()
    sys.exit(app.exec_())

关键改动说明

  • 创建QWidget实例作为中央部件,所有自定义布局和控件都挂载到这个部件上
  • 调用setCentralWidget()将中央部件绑定到QMainWindow,替代原有的直接调用setLayout()的操作

修改完成后,按钮就能正常显示在窗口中了。

内容的提问来源于stack exchange,提问作者Shane O Neil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:15:29