[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 本身不需要布局管理器,因为它的布局是由内部的组件(例如菜单、工具栏和状态栏)管理的。每个组件都有自己的位置和大小管理方式。
发表评论