[Python]PyQt6 窗口类型-QMainWindow

前言

QMainWindow、QWidget和QDialog三个类都是用来创建窗口的,可以直接使用,也可以继承后再使用。 这篇文章先探索QMainWindow。

QMainWindow

QMainWindow是 PyQt 中用于构建主窗口的类,它提供了一个框架,可以轻松地添加菜单栏、工具栏、状态栏和中心窗口小部件。

组件

  • 菜单栏:可以包含多个菜单项,例如“文件”、“编辑”等。
  • 工具栏:通常用来放置常用操作的按钮。
  • 状态栏:用于显示程序的状态信息。
  • 中心小部件:这是窗口的主要内容区域,通常是一个布局或其他小部件。

组件使用案例

菜单栏

python

import sys
from PyQt6.QtWidgets import (
    QApplication,
    QMainWindow,
    QToolBar,
    QLabel,
    QVBoxLayout,
    QWidget,
    QStatusBar,
)
from PyQt6.QtGui import QAction


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QMainWindow 示例")
        self.resize(800, 600)

        # 创建菜单栏
        self.menu_bar = self.menuBar()
        file_menu = self.menu_bar.addMenu("文件")

        # 添加菜单项
        exit_action = QAction("退出", self)
        exit_action.triggered.connect(self.close)  # 连接退出事件
        file_menu.addAction(exit_action)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec())

这段代码使用使用 self.menuBar() 创建菜单,并添加“文件”菜单和退出操作。

工具栏

在上面代码的基础上,继续扩展,核心代码如下

php

# 创建工具栏
self.tool_bar = QToolBar("工具栏")
self.addToolBar(self.tool_bar)

# 添加工具栏按钮
toolbar_action = QAction("显示消息", self)
self.tool_bar.addAction(toolbar_action)

创建一个工具栏并添加一个按钮”显示消息”

状态栏

核心代码如下:

php

# 创建状态栏
self.status_bar = QStatusBar()
self.setStatusBar(self.status_bar)
self.status_bar.showMessage("工具栏按钮被点击!", 2000)  # 消息持续2秒

使用 QStatusBar 来显示状态信息

显示消息按钮增加点击事件

结合状态栏消息显示,修改代码如下:

python

...
# 添加工具栏按钮
toolbar_action = QAction("显示消息", self)
toolbar_action.triggered.connect(self.show_message)
self.tool_bar.addAction(toolbar_action)

def show_message(self):
    """在状态栏显示消息"""
    self.status_bar.showMessage("工具栏按钮被点击!", 2000)  # 消息持续2秒

这样通过连接信号来响应按钮点击事件,点击工具栏上的按钮会在状态栏中显示一条消息。

中心小部件

核心代码如下:

python

# 创建中心小部件
self.central_widget = QWidget()
self.setCentralWidget(self.central_widget)

# 创建布局并添加到中心小部件
self.layout = QVBoxLayout()
self.label = QLabel("欢迎使用 QMainWindow!")
self.layout.addWidget(self.label)
self.central_widget.setLayout(self.layout)

这段代码创建一个 QWidget 作为中心小部件,并设置布局(QVBoxLayout)和标签(QLabel)。

主窗口放在屏幕中间

主窗口初始化后,将其放在屏幕中间。
核心代码如下:

scss

def center(self):
    screen: QScreen = QApplication.primaryScreen()
    size = screen.availableGeometry()
    self.move((size.width() - self.width()) // 2, (size.height() - self.height()) // 2)  # 居中窗口
  • 使用 QApplication.primaryScreen():获取当前活动屏幕。
  • 使用 availableGeometry():此方法返回屏幕的可用区域。
  • 计算和移动窗口位置:通过 self.move() 方法将窗口居中。

关闭主窗口

核心代码如下:

scss

class MainWindow(QMainWindow):

    def __init__(self, parent=None):
        super(WinForm, self).__init__(parent)
        self.resize(330, 100)
        self.setWindowTitle('关闭主窗口例子')

        main_frame = QWidget()
        self.setCentralWidget(main_frame)

        layout = QHBoxLayout()
        self.button = QPushButton('关闭主窗口')
        self.button.clicked.connect(self.onButtonClick)
        layout.addWidget(self.button)

        main_frame.setLayout(layout)

    def onButtonClick(self):
        # sender 是发送信号的对象,此处发送信号的对象是button1按钮
        sender = self.sender()
        print(sender.text() + ' 被按下了')
        qApp = QApplication.instance()
        qApp.quit()
  • self.sender() 用于获取发出信号的对象。在这个上下文中,sender 将引用被点击的按钮(例如 button)。这让你可以在槽函数内部知道哪个按钮被点击了。
  • QApplication.instance() 返回当前应用程序的实例。这是一个全局访问点,用于管理整个应用程序的状态。
  • 调用 quit() 方法来退出应用程序

quit() 和 close()区别

quit()

  • 作用 :调用 QApplication.quit() 会结束整个应用程序。
  • 行为 :它会触发事件循环的退出,从而关闭所有窗口并终止应用程序。通常用于在用户选择退出时,如点击“退出”按钮。
  • 使用场景 :主要在需要完全终止应用程序时使用,比如在菜单中选择“退出”或按下一个退出按钮。

close()

  • 作用 :调用 QWidget.close() 或者 QMainWindow.close() 仅会关闭当前窗口。
  • 行为 :如果该窗口是主窗口且没有其他窗口打开,应用程序可能会退出,但如果有其他窗口仍然打开,应用程序会继续运行。
  • 使用场景 :用于关闭单个窗口,而不影响其他窗口。例如,当用户关闭某个对话框或子窗口时,可以使用 close() 方法。

QMainWindow不能设置布局(使用setLayout()方法)

QMainWindow 不能直接使用 setLayout() 方法的原因在于它的设计理念和类结构。
设计理念

  • 中心小部件:QMainWindow 通过 setCentralWidget() 方法来设置其中心小部件,而不是通过布局。这样设计是为了保持窗口的结构化,确保中心小部件能独占显示区域。
  • 布局管理:QMainWindow 本身不需要布局管理器,因为它的布局是由内部的组件(例如菜单、工具栏和状态栏)管理的。每个组件都有自己的位置和大小管理方式。

标签

发表评论