PyQt4学习笔记2】QMainWindow

目录

一、创建 QMainWindow 组件

1. 创建工具栏

2. 创建停靠窗口

3. 设置状态栏

4. 设置中央窗口部件

二、QMainWindow 的主要方法

1. addToolBar()

2. addDockWidget()

3. setStatusBar()

4. setCentralWidget()

5. menuBar()

6. saveState() 和 restoreState()

三、QMainWindow 的高级功能

1. 动画效果

2. 停靠窗口嵌套

3. 自定义上下文菜单

完整示例

参考资料


QMainWindow 是 PyQt4 中用于创建主应用程序窗口的类。它提供了一个经典的窗口布局,包括菜单栏、工具栏、状态栏和中央窗口部件。此外,它还支持停靠窗口(dock widgets)和拆分窗口(MDI - Multiple Document Interface)等功能。

一、创建 QMainWindow 组件

1. 创建工具栏

工具栏由 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")

2. 创建停靠窗口

停靠窗口由 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)

3. 设置状态栏

可以通过 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;
            }
        """)

4. 设置中央窗口部件

中央窗口部件是主窗口的核心部分,可以通过 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)

二、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 创建一个包含菜单栏、工具栏、停靠窗口和状态栏的主窗口:
PyQt4学习笔记2】QMainWindow_第1张图片

# -*- 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-------------------------

才疏学浅,谬误难免,欢迎各位批评指正。

你可能感兴趣的:(#,PyQt4,学习,笔记,pyqt,python)