必须先调用setCentralWidget,因为QMainWindow依赖它作为布局锚点,否则菜单栏、工具栏、停靠窗口等将错乱或不可见;所有区域必须通过专用接口添加,且中央部件不能为空。

必须先设置 setCentralWidget,否则其他区域(菜单栏、工具栏、停靠窗口)会布局错乱甚至不可见。
为什么 QMainWindow 不能直接用 setLayout
QMainWindow 内部有一套预设的区域骨架,不是普通容器。你调用 setLayout 会覆盖它的私有布局系统,导致菜单栏被挤掉、状态栏消失、addToolBar 失效等现象。所有子部件都必须通过对应接口注入:菜单栏走 menuBar(),工具栏走 addToolBar(),停靠窗口走 addDockWidget(),状态栏走 statusBar(),主内容区只能走 setCentralWidget()。
setCentralWidget 是布局锚点,不是可选项
它决定了整个窗口的空间分配基准。没有它,QMainWindow 就像没放桌面的书桌——四周的 QDockWidget 会失去停靠参照,可能塌缩成一条线,或撑满整个窗口;拖动分割器时尺寸行为异常;saveState/restoreState 也会失效。
- 中央部件必须是非空指针,哪怕只是
new QWidget(this) - 建议尽早设置,在构造函数开头就调用,不要延迟到信号槽里
- 如果业务逻辑需要动态切换主界面,用
QWidget::hide()/show()或QStackedWidget管理,而不是反复调用setCentralWidget
菜单栏、工具栏、状态栏的创建时机和位置陷阱
它们看似独立,但实际受中央部件尺寸约束。比如在 resize(800, 600) 之后再创建工具栏,某些高 DPI 缩放下可能出现工具栏按钮被截断;状态栏里的永久部件(如 QLabel)若没调用 statusBar()->addPermanentWidget(),而是直接 addWidget(),就会被临时消息顶掉。
-
menuBar()返回的是内置实例,无需new,重复调用不会新建 - 工具栏默认停靠在顶部,用
addToolBar(Qt::LeftToolBarArea, toolbar)可指定停靠边 - 状态栏默认高度固定,想加进度条或自定义控件,优先用
addPermanentWidget而非addWidget
QDockWidget 停靠后不显示?检查三个硬性条件
常见现象是调用了 addDockWidget 却看不到面板,或者拖出来后一松手就消失。根本原因通常是以下任意一条未满足:
- 中央部件尚未设置(
setCentralWidget没调用或传了nullptr) - 停靠窗口自身未调用
show()(QDockWidget默认hide()) - 停靠区域被禁用,比如
setDockNestingEnabled(false)后又尝试上下嵌套停靠
另外,QDockWidget 的 setFeatures() 如果关掉了 QDockWidget::DockWidgetClosable,首次添加时可能因无关闭按钮而被用户误认为“没加载成功”。
真正容易被忽略的是:QMainWindow 的布局状态(比如 Dock 位置、工具栏是否浮动)默认不持久化。不手动调用 saveState 和 restoreState,每次重启窗口都会回到初始布局,哪怕你花了半小时调好分屏比例。


















