目录
一、创建 QMainWindow 组件
1. 创建工具栏
2. 创建停靠窗口
3. 设置状态栏
4. 设置中央窗口部件
二、QMainWindow 的主要方法
1. addToolBar()
2. addDockWidget()
3. setStatusBar()
4. setCentralWidget()
6. saveState() 和 restoreState()
三、QMainWindow 的高级功能
1. 动画效果
2. 停靠窗口嵌套
3. 自定义上下文菜单
完整示例
参考资料
QMainWindow
是 PyQt4 中用于创建主应用程序窗口的类。它提供了一个经典的窗口布局,包括菜单栏、工具栏、状态栏和中央窗口部件。此外,它还支持停靠窗口(dock widgets)和拆分窗口(MDI - Multiple Document Interface)等功能。
一、创建 QMainWindow 组件
1. 创建工具栏
工具栏由 QToolBar
类实现。可以通过 addToolBar()
方法将工具栏添加到主窗口中。工具栏可以被放置在窗口的顶部、底部、左侧或右侧。
from PyQt4 import QtGuiclass Example(QtGui.QMainWindow):def __init__(self):super(Example, self).__init__()self.initUI()def initUI(self):# 创建工具栏toolbar = self.addToolBar("File")toolbar.addAction("Open", self.openFile)toolbar.addAction("Save", self.saveFile)self.setWindowTitle("QMainWindow Example")self.resize(400, 300)def openFile(self):print("Open file")def saveFile(self):print("Save file")
2. 创建停靠窗口
停靠窗口由 QDockWidget
类实现。可以通过 addDockWidget()
方法将停靠窗口添加到主窗口中。
from PyQt4 import QtGuiclass Example(QtGui.QMainWindow):def __init__(self):super(Example, self).__init__()self.initUI()def initUI(self):# 创建停靠窗口dockWidget = QtGui.QDockWidget("Dock Widget", self)dockWidget.setWidget(QtGui.QLabel("This is a dock widget"))# 在停靠和浮动时设置QDockWidget的边框dockWidget.setStyleSheet("""/* 设置QDockWidget导航栏的边框 */QDockWidget#dockWidget {background-color: lightblue; /* 设置背景颜色 */border: 2px solid black; /* 设置边框 */border-radius: 5px; /* 设置边框圆角 */}/* 在停靠和浮动时设置QDockWidget边框 */QDockWidget > QWidget {border: 5px solid purple;}""")self.addDockWidget(QtGui.Qt.LeftDockWidgetArea, dockWidget)self.setWindowTitle("QMainWindow Example")self.resize(400, 300)
3. 设置状态栏
可以通过 setStatusBar()
方法设置状态栏。状态栏是一个 QStatusBar
对象,用于显示状态信息。
from PyQt4 import QtGuiclass Example(QtGui.QMainWindow):def __init__(self):super(Example, self).__init__()self.initUI()def initUI(self):# 创建一个状态栏self.status_bar = QtGui.QStatusBar()self.setStatusBar(self.status_bar)# 显示一条状态消息self.status_bar.showMessage(u"欢迎使用 PyQt4!", 3000) # 消息停留 3000 毫秒(3秒)# 设置状态栏的样式表self.statusBar().setStyleSheet("""QStatusBar {background-color: lightgreen;}""")
4. 设置中央窗口部件
中央窗口部件是主窗口的核心部分,可以通过 setCentralWidget()
方法设置。
from PyQt4 import QtGuiclass Example(QtGui.QMainWindow):def __init__(self):super(Example, self).__init__()self.initUI()def initUI(self):# 创建中央窗口部件centralWidget = QtGui.QWidget()self.setCentralWidget(centralWidget)self.setWindowTitle("QMainWindow Example")self.resize(400, 300)
二、QMainWindow 的主要方法
1. addToolBar()
将工具栏添加到主窗口中。可以指定工具栏的位置(如顶部、底部、左侧或右侧)。
toolbar = self.addToolBar("File", QtGui.Qt.TopToolBarArea)
2. addDockWidget()
将停靠窗口添加到主窗口中。第一个参数可以指定停靠窗口的位置(如顶部:QtCore.Qt.TopDockWidgetArea、底部、左侧:QtCore.Qt.LeftDockWidgetArea或右侧)。
dockWidget = QtGui.QDockWidget("Dock Widget", self)
self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, dockWidget)
3. setStatusBar()
设置主窗口的状态栏。
# 创建一个状态栏
self.status_bar = QtGui.QStatusBar()
self.setStatusBar(self.status_bar)# 显示一条状态消息
self.status_bar.showMessage(u"欢迎使用 PyQt4!", 3000) # 消息停留 3000 毫秒(3秒)
4. setCentralWidget()
设置主窗口的中央窗口部件。
centralWidget = QtGui.QWidget()
self.setCentralWidget(centralWidget)
# 设置中央窗口部件(Central Widget)的边框和背景颜色
centralWidget.setStyleSheet("""QWidget {background-color: lightyellow;border: 2px dashed red;}
""")
5. menuBar()
获取主窗口的菜单栏。
menuBar = self.menuBar()
6. saveState()
和 restoreState()
保存和恢复主窗口的状态(包括工具栏和停靠窗口的布局)。
# 保存状态
state = self.saveState()# 恢复状态
self.restoreState(state)
三、QMainWindow 的高级功能
1. 动画效果
可以通过 setAnimated()
方法启用或禁用动画效果。
self.setAnimated(True)
2. 停靠窗口嵌套
可以通过 setDockNestingEnabled()
方法启用或禁用停靠窗口的嵌套功能。
self.setDockNestingEnabled(True)
3. 自定义上下文菜单
可以通过重写 createPopupMenu()
方法来自定义主窗口的上下文菜单。
class Example(QtGui.QMainWindow):def createPopupMenu(self):menu = QtGui.QMenu(self)menu.addAction("Custom Action")return menu
完整示例
以下是一个完整的示例,展示了如何使用 QMainWindow
创建一个包含菜单栏、工具栏、停靠窗口和状态栏的主窗口:
# -*- coding: utf-8 -*-from PyQt4 import QtGui, QtCoreclass Example(QtGui.QMainWindow):def __init__(self):super(Example, self).__init__()self.initUI()def initUI(self):# 创建菜单栏menubar = self.menuBar()fileMenu = menubar.addMenu("File")fileMenu.addAction("Exit", self.close)# 创建工具栏toolbar = self.addToolBar("File")toolbar.addAction("Open", self.openFile)toolbar.addAction("Save", self.saveFile)# 创建停靠窗口dockWidget = QtGui.QDockWidget("Dock Widget", self)# 创建一个 QLabel 作为 QDockWidget 的内容self.label = QtGui.QLabel(u"这是 QDockWidget 的内容区域", dockWidget)# 设置 QLabel 的背景色self.label.setStyleSheet("background-color: #4CAF50;")dockWidget.setWidget(self.label)# 设置停靠窗口的样式表# 设置对象名称:为 QDockWidget 设置对象名称,然后在样式表中使用该名称进行选择。dockWidget.setObjectName("dockWidget")# self.setStyleSheet("""# QMainWindow {# background-color: white;# }# QDockWidget#dockWidget {# background-color: lightblue;# border: 2px solid black;# border-radius: 5px;# }# """)dockWidget.setStyleSheet("""/* 设置QDockWidget导航栏的边框 */QDockWidget#dockWidget {background-color: lightblue; /* 设置背景颜色 */border: 2px solid black; /* 设置边框 */border-radius: 5px; /* 设置边框圆角 */}/* 在停靠和浮动时设置QDockWidget边框 */QDockWidget > QWidget {border: 5px solid purple;}""")# 设置整个窗口的样式表,包括 QDockWidget 的背景色self.setStyleSheet("QDockWidget { background-color: #4CAF50; }")self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, dockWidget)# 创建状态栏# 创建一个状态栏self.status_bar = QtGui.QStatusBar()self.setStatusBar(self.status_bar)# 显示一条状态消息self.status_bar.showMessage(u"欢迎使用 PyQt4!", 3000) # 消息停留 3000 毫秒(3秒)# 设置状态栏的样式表self.statusBar().setStyleSheet("""QStatusBar {background-color: lightgreen;}""")# 创建中央窗口部件centralWidget = QtGui.QWidget()self.setCentralWidget(centralWidget)# 设置中央窗口部件(Central Widget)的边框和背景颜色centralWidget.setStyleSheet("""QWidget {background-color: lightyellow;border: 2px dashed red;}""")self.setWindowTitle("QMainWindow Example")self.resize(1000, 800)def openFile(self):print("Open file")def saveFile(self):print("Save file")if __name__ == "__main__":app = QtGui.QApplication([])ex = Example()ex.show()app.exec_()# 确保通过 QtCore.Qt 来访问 Qt 命名空间中的成员,而不是 QtGui.Qt。
参考资料
-
QMainWindow Class Reference - 《PyQt4 中文文档》
------------------------END-------------------------
才疏学浅,谬误难免,欢迎各位批评指正。