这篇文章专门讲 PyQt6 的“界面骨架能力”:布局系统 + QMainWindow。学完你就能搭出结构清晰、可维护的主程序窗口。
1. 为什么要学 QMainWindow
QWidget 适合简单窗口,而 QMainWindow 原生支持:
- 菜单栏(MenuBar)
- 工具栏(ToolBar)
- 状态栏(StatusBar)
- 中央区域(Central Widget)
- 停靠面板(Dock Widget)
这正是桌面软件常见形态。
2. 最小主窗口代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| import sys from PyQt6.QtWidgets import QApplication, QMainWindow, QLabel
class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("PyQt6 主窗口") self.resize(900, 600)
center = QLabel("欢迎使用 PyQt6") center.setStyleSheet("font-size: 20px; padding: 20px;") self.setCentralWidget(center)
if __name__ == "__main__": app = QApplication(sys.argv) w = MainWindow() w.show() sys.exit(app.exec())
|
3. 菜单栏与动作(QAction)
1 2 3 4 5 6 7 8 9 10 11 12 13
| from PyQt6.QtGui import QAction
file_menu = self.menuBar().addMenu("文件") open_action = QAction("打开", self) save_action = QAction("保存", self) exit_action = QAction("退出", self)
file_menu.addAction(open_action) file_menu.addAction(save_action) file_menu.addSeparator() file_menu.addAction(exit_action)
exit_action.triggered.connect(self.close)
|
经验:把所有 Action 放到单独方法 create_actions(),后续快捷键和权限控制更好维护。
4. 工具栏与状态栏
1 2 3 4 5
| toolbar = self.addToolBar("主工具栏") toolbar.addAction(open_action) toolbar.addAction(save_action)
self.statusBar().showMessage("就绪")
|
状态栏建议用来反馈:
5. 布局系统实践:左右分栏 + 顶部过滤
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| from PyQt6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QListWidget, QTextEdit, QLineEdit
container = QWidget() root = QVBoxLayout(container)
search = QLineEdit() search.setPlaceholderText("输入关键词过滤...") root.addWidget(search)
content = QHBoxLayout() left_list = QListWidget() right_editor = QTextEdit() content.addWidget(left_list, 2) content.addWidget(right_editor, 5)
root.addLayout(content) self.setCentralWidget(container)
|
这就是典型“后台管理/笔记软件”基础框架。
6. 停靠面板(Dock)提升扩展性
1 2 3 4 5 6 7
| from PyQt6.QtWidgets import QDockWidget, QTextEdit from PyQt6.QtCore import Qt
dock = QDockWidget("日志", self) dock.setAllowedAreas(Qt.DockWidgetArea.LeftDockWidgetArea | Qt.DockWidgetArea.RightDockWidgetArea) dock.setWidget(QTextEdit()) self.addDockWidget(Qt.DockWidgetArea.RightDockWidgetArea, dock)
|
后续可放:日志、属性面板、任务队列。
7. 推荐工程化写法
建议分层:
main_window.py:界面结构
actions.py:动作定义与信号连接
views/:左面板、右面板等子组件
services/:业务处理
避免把所有逻辑塞进一个窗口类。
8. 小结
掌握 QMainWindow + 布局 后,你已经具备开发“真正桌面软件”的基础框架能力。下一篇建议学习线程与进度条,解决“耗时操作导致卡界面”的痛点。