目录
一、创建 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)等功能。
工具栏由 QToolBar
类实现。可以通过 addToolBar()
方法将工具栏添加到主窗口中。工具栏可以被放置在窗口的顶部、底部、左侧或右侧。
from PyQt4 import QtGui
class 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")
停靠窗口由 QDockWidget
类实现。可以通过 addDockWidget()
方法将停靠窗口添加到主窗口中。
from PyQt4 import QtGui
class 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)
可以通过 setStatusBar()
方法设置状态栏。状态栏是一个 QStatusBar
对象,用于显示状态信息。
from PyQt4 import QtGui
class 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;
}
""")
中央窗口部件是主窗口的核心部分,可以通过 setCentralWidget()
方法设置。
from PyQt4 import QtGui
class 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)
addToolBar()
将工具栏添加到主窗口中。可以指定工具栏的位置(如顶部、底部、左侧或右侧)。
toolbar = self.addToolBar("File", QtGui.Qt.TopToolBarArea)
addDockWidget()
将停靠窗口添加到主窗口中。第一个参数可以指定停靠窗口的位置(如顶部:QtCore.Qt.TopDockWidgetArea、底部、左侧:QtCore.Qt.LeftDockWidgetArea或右侧)。
dockWidget = QtGui.QDockWidget("Dock Widget", self)
self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, dockWidget)
setStatusBar()
设置主窗口的状态栏。
# 创建一个状态栏
self.status_bar = QtGui.QStatusBar()
self.setStatusBar(self.status_bar)
# 显示一条状态消息
self.status_bar.showMessage(u"欢迎使用 PyQt4!", 3000) # 消息停留 3000 毫秒(3秒)
setCentralWidget()
设置主窗口的中央窗口部件。
centralWidget = QtGui.QWidget()
self.setCentralWidget(centralWidget)
# 设置中央窗口部件(Central Widget)的边框和背景颜色
centralWidget.setStyleSheet("""
QWidget {
background-color: lightyellow;
border: 2px dashed red;
}
""")
menuBar()
获取主窗口的菜单栏。
menuBar = self.menuBar()
saveState()
和 restoreState()
保存和恢复主窗口的状态(包括工具栏和停靠窗口的布局)。
# 保存状态
state = self.saveState()
# 恢复状态
self.restoreState(state)
可以通过 setAnimated()
方法启用或禁用动画效果。
self.setAnimated(True)
可以通过 setDockNestingEnabled()
方法启用或禁用停靠窗口的嵌套功能。
self.setDockNestingEnabled(True)
可以通过重写 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, QtCore
class 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-------------------------
才疏学浅,谬误难免,欢迎各位批评指正。