使用 PyQt6 创建您的第一个应用程序
目录
- 一、说明
- 二、创建应用程序
- 三、单步执行代码
- 四、什么是事件循环?
- 4.1 Qt 中的事件循环。
- 五、主窗口 QMainWindow
- 六、调整窗口和小部件的大小
一、说明
本教程也适用于 PySide6 、 PySide2 和 PyQt5
在本教程中,我们将学习如何使用 PyQt6 通过 Python 创建桌面应用程序。首先,我们将在桌面上创建一系列简单的窗口,以确保 PyQt 正常工作并介绍一些基本概念。然后我们将简要了解一下事件循环以及它与 Python 中的 GUI 编程的关系。最后我们将看看 Qt,QMainWindow它提供了一些有用的通用界面元素,例如工具栏和菜单。这些将在后续教程中进行更详细的探讨。
二、创建应用程序
让我们创建我们的第一个应用程序!要开始创建一个新的 Python 文件,您可以将其命名为任何您喜欢的名称(例如app.py)并将其保存在可访问的位置。我们将在此文件中编写简单的应用程序。
我们将在此文件中进行编辑,您可能想返回到代码的早期版本,因此请记住定期备份。
该应用程序的源代码如下所示。逐字输入,注意不要出错。如果你确实搞砸了,Python 会让你知道出了什么问题。
from PyQt6.QtWidgets import QApplication, QWidget# Only needed for access to command line arguments
import sys# You need one (and only one) QApplication instance per application.
# Pass in sys.argv to allow command line arguments for your app.
# If you know you won't use command line arguments QApplication([]) works too.
app = QApplication(sys.argv)# Create a Qt widget, which will be our window.
window = QWidget()
window.show() # IMPORTANT!!!!! Windows are hidden by default.# Start the event loop.
app.exec()# Your application won't reach here until you exit and the event
# loop has stopped.
首先,启动您的应用程序。您可以像任何其他 Python 脚本一样从命令行运行它,例如 –
运行!您现在将看到您的窗口。 Qt 会自动创建一个带有普通窗口装饰的窗口,您可以像任何窗口一样拖动它并调整它的大小。
您将看到的内容取决于您运行此示例的平台。下图显示了 Windows、macOS 和 Linux (Ubuntu) 上显示的窗口。
我们的窗口,如 Windows、macOS 和 Linux 上所示。
三、单步执行代码
让我们逐行浏览代码,以便我们准确地了解发生了什么。
首先,我们导入应用程序所需的 PyQt 类。在这里,我们从模块导入QApplication应用程序处理程序和QWidget基本的空QtWidgetsGUI 小部件。
from PyQt6.QtWidgets import QApplication, QWidget
Qt 的主要模块是QtWidgets、QtGui和QtCore。
你可以这样做,from import *但这种全局导入在 Python 中通常是不良好的习惯,所以我们在这里避免它。
接下来我们创建一个 的实例QApplication,传入sys.arg,它是list包含传递给应用程序的命令行参数的 Python。
app = QApplication(sys.argv)
如果您知道您不会使用命令行参数来控制 Qt,您可以传入一个空列表,例如
app = QApplication([])
QWidget接下来我们使用变量 name创建 a 的实例window。
window = QWidget()
window.show()
在 Qt 中,所有顶级小部件都是窗口——也就是说,它们没有父级,也没有嵌套在另一个小部件或布局中。这意味着您可以在技术上使用您喜欢的任何小部件创建窗口。
没有父级的 小部件默认是不可见的。因此,创建window对象后,我们必须始终调用.show()以使其可见。您可以删除.show()并运行该应用程序,但您无法退出它!
什么是窗户? - 保存应用程序的用户界面 - 每个应用程序至少需要一个(…但可以有更多) - 应用程序将(默认情况下)在最后一个窗口关闭时退出
最后,我们调用app.exec()启动事件循环。
四、什么是事件循环?
在将窗口显示在屏幕上之前,需要介绍一些有关 Qt 世界中应用程序如何组织的关键概念。如果您已经熟悉事件循环,则可以安全地跳到下一部分。
每个 Qt 应用程序的核心是QApplication类。每个应用程序都需要一个(而且只需要一个)QApplication对象来运行。该对象保存应用程序的事件循环——控制所有用户与 GUI 交互的核心循环。
4.1 Qt 中的事件循环。
与应用程序的每次交互(无论是按下按键、单击鼠标还是移动鼠标)都会生成一个事件,该事件被放置在事件队列中。在事件循环中,每次迭代都会检查队列,如果发现等待事件,则将该事件和控制权传递给该事件的特定事件处理程序。事件处理程序处理该事件,然后将控制权传递回事件循环以等待更多事件。每个应用程序只有一个正在运行的事件循环。
该类QApplication-QApplication保存 Qt 事件循环 - 需要一个实例 - 您的应用程序在事件循环中等待,直到采取操作 -任何时候都QApplication只有一个事件循环在运行
五、主窗口 QMainWindow
正如我们在上一部分中发现的,在 Qt 中任何小部件都可以是窗口。例如,如果您替换QtWidget为QPushButton.在下面的示例中,您将看到一个窗口,其中有一个可按的按钮。
import sys
from PyQt6.QtWidgets import QApplication, QPushButtonapp = QApplication(sys.argv)window = QPushButton("Push Me")
window.show()app.exec()
这很简洁,但实际上并不是很有用——您很少需要一个仅包含单个控件的 UI!但是,正如我们稍后将发现的,使用布局将小部件嵌套在其他小部件中的能力意味着您可以拥有空的QWidget.
但是,Qt 已经为您提供了一个解决方案—— QMainWindow.这是一个预制的小部件,提供了许多您将在应用程序中使用的标准窗口功能,包括工具栏、菜单、状态栏、可停靠小部件等。稍后我们将介绍这些高级功能,但现在,我们将向QMainWindow我们的应用程序添加一个简单的空。
import sys
from PyQt6.QtWidgets import QApplication, QMainWindowapp = QApplication(sys.argv)window = QMainWindow()
window.show()# Start the event loop.
app.exec()
运行!您现在将看到主窗口。看上去和以前一模一样!
所以我们QMainWindow目前并不是很有趣。我们可以通过添加一些内容来解决这个问题。如果您想创建自定义窗口, 最好的方法是子类化QMainWindow,然后将窗口的设置包含在__init__块中。这允许窗口行为是独立的。我们可以添加我们自己的子类QMainWindow- 调用它MainWindow以保持简单。
import sysfrom PyQt6.QtCore import QSize, Qt
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton
# Subclass QMainWindow to customize your application's main window
class MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("My App")button = QPushButton("Press Me!")# Set the central widget of the Window.self.setCentralWidget(button)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
对于此演示,我们使用的是QPushButton.核心 Qt 小部件始终从命名空间导入QtWidgets,就像QMainWindow和QApplication类一样。使用时QMainWindow,我们通常.setCentralWidget将一个小部件(此处为 a QPushButton)放在QMainWindow- 默认情况下它占据整个窗口。我们将在布局教程中了解如何向窗口添加多个小部件。
当您子类化 Qt 类时,您必须始终调用 super__init__函数以允许 Qt 设置该对象。
在我们的__init__块中,我们首先用来.setWindowTitle()更改主窗口的标题。然后我们将第一个小部件 - a QPushButton- 添加到窗口的中间。这是 Qt 中可用的基本小部件之一。创建按钮时,您可以传入希望按钮显示的文本。
最后,我们调用.setCentralWidget()窗口。这是一个QMainWindow特定的功能,允许您设置位于窗口中间的小部件。
运行!现在您将再次看到窗口,但这次小QPushButton部件位于中间。按下按钮不会执行任何操作,我们接下来会对此进行排序。
我们的 QMainWindow 在 Windows、macOS 和 Linux 上带有单个 QPushButton。
我们在 Windows、macOS 和 Linux 上QMainWindow都有一个版本QPushButton。
我们很快就会详细介绍更多小部件,但如果您不耐烦并想跳到前面,您可以查看QWidget 文档。尝试将不同的小部件添加到您的窗口!
六、调整窗口和小部件的大小
该窗口目前可以自由调整大小 - 如果您用鼠标抓住任何角落,则可以拖动它并将其调整为您想要的任何大小。虽然让用户调整应用程序的大小是件好事,但有时您可能希望对最小或最大大小进行限制,或者将窗口锁定为固定大小。
在 Qt 中,大小是使用QSize对象定义的。这按顺序接受宽度和高度参数。例如,以下将创建一个400x300 像素的固定大小窗口。
import sysfrom PyQt6.QtCore import QSize, Qt
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton# Subclass QMainWindow to customize your application's main window
class MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("My App")button = QPushButton("Press Me!")self.setFixedSize(QSize(400, 300))# Set the central widget of the Window.self.setCentralWidget(button)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
运行!您将看到一个固定大小的窗口 - 尝试调整它的大小,这是行不通的。
我们的固定大小窗口,请注意,maximize 控件在 Windows 和 Linux 上被禁用。在 macOS 上,您_可以_最大化应用程序以填满屏幕,但中央小部件不会调整大小。
我们的固定大小窗口,请注意 maximize
控制在 Windows 和 Linux 上被禁用。在 macOS 上,您可以最大化应用程序以填满屏幕,但中央小部件不会调整大小。
.setFixedSize()您还可以调用和.setMinimumSize()分别.setMaximumSize()设置最小和最大尺寸。自己尝试一下!
您可以在任何小部件上使用这些尺寸方法。
在本节中,我们介绍了QApplication类、QMainWindow类、事件循环,并尝试向窗口添加一个简单的小部件。在下一节中,我们将了解 Qt 为小部件和窗口之间以及您自己的代码之间进行通信所提供的机制。