PyQt是一个Python库,用于使用Qt工具包创建GUI应用程序。PyQt由Riverbank Computing创建,是自由软件(GPL许可),自1999年以来一直在开发中。最新版本PyQt6 - 基于Qt 6 - 于2021年发布,该库将继续更新
目前有两个主要版本在使用中:基于Qt5的PyQt5和基于Qt6的PyQt6。除了导入之外,这两个版本几乎完全兼容,并且缺乏对Qt6中某些高级模块的支持。PyQt6还对命名空间和标志的工作方式进行了一些更改,但这些更改很容易管理.
首先,我们将在桌面上创建一系列简单的窗口,以确保PyQt能够正常工作,并介绍一些基本概念。然后,我们将简要地看一下事件循环以及它与Python中的GUI编程之间的关系。最后,我们来看看Qt的QMainWindow,它提供了一些有用的通用界面元素,比如工具栏和菜单。这些将在后续教程中进行更详细的探讨。
创建应用程序
让我们创建我们的第一个应用程序!开始创建一个新的Python文件-你可以随意命名它(例如app.py),并将其保存在可访问的地方。我们将在这个文件中编写简单的应用程序。
我们将在这个文件中进行编辑,您可能想要回到代码的早期版本,所以请记住定期备份。
应用程序的源代码如下所示。一字不差地打出来,注意不要出错。如果你确实搞砸了,Python会让你知道哪里出了问题。
from PyQt5.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
首先,启动应用程序。您可以像运行任何其他Python脚本一样从命令行运行它,例如——
python3 app.py
您将看到的内容取决于您在哪个平台上运行这个示例。如下图所示为Windows、macOS和Linux (Ubuntu)下的窗口。逐步执行代码
让我们逐行检查代码,以便准确地理解发生了什么。
首先,我们导入应用程序所需的PyQt类。在这里,我们从QtWidgets模块导入应用程序处理程序QApplication和一个基本的空GUI小部件QWidget。
from PyQt5.QtWidgets import QApplication, QWidget
Qt的主要模块有QtWidgets, QtGui和QtCore。
你可以使用from <module> import *,但是这种全局导入通常在Python中是不被允许的,所以我们将在这里避免使用它。
接下来,我们创建一个QApplication实例,传入sys。arg,它是Python列表,包含传递给应用程序的命令行参数。
app = QApplication(sys.argv)
如果你知道你不会使用命令行参数来控制Qt,你可以传入一个空的列表代替。
app = QApplication([])
接下来,我们使用变量名窗口创建一个QWidget实例。
window = QWidget()
window.show()
在Qt中,所有顶级的小部件都是窗口——也就是说,它们没有父部件,也没有嵌套在其他小部件或布局中。这意味着您可以在技术上使用任何小部件创建窗口。
<font style=background:#FBE9E7>没有父控件的小部件在默认情况下是不可见的。因此,在创建窗口对象之后,我们必须始终调用.show()使其可见。您可以删除.show()并运行应用程序,但您将无法退出它!</font>
<font style=background:#FBE9E7>窗户是什么?-保存你的应用程序的用户界面-每个应用程序至少需要一个(…但可以有更多)-应用程序(默认)退出时,最后一个窗口关闭</font>
最后,我们调用app.exec()来启动事件循环。
<font style=background:#FFFAED>
在PyQt5中,你也可以使用app.exec_()。这是一个遗留特性,可以避免与Python2中的exec保留字发生冲突。</font>
什么是事件循环?
在屏幕上显示窗口之前,要介绍一些关于Qt中如何组织应用程序的关键概念。如果您已经熟悉了事件循环,您可以安全地跳到下一节。
Qt应用程序的核心是QApplication类。每个应用程序都需要并且只需要一个QApplication对象来运行。这个对象保存了应用程序的事件循环——控制所有用户与GUI交互的核心循环。
与应用程序的每次交互——无论是按下键、单击鼠标还是移动鼠标——都会生成一个事件,该事件被放置在事件队列中。在事件循环中,每次迭代都检查队列,如果发现等待事件,则将事件和控制传递给该事件的特定事件处理程序。事件处理程序处理事件,然后将控制权传回事件循环以等待更多事件。每个应用程序只有一个正在运行的事件循环。
在PyQt5中,你也可以使用app.exec_()。这是一个遗留特性,可以避免与Python2中的exec保留字发生冲突。