PyQt5教程及示例:创建 Python 使用 Qt 的 GUI
⚡ 智能摘要
PyQt 是一个 Python 这是跨平台 Qt 组件工具包的绑定,允许开发者构建原生桌面 GUI。它封装了超过六百个组件。 C++ 涵盖窗口、按钮、布局、信号、插槽和主题的类 Windows, macOS和Linux。

以下各节将带您从 PyQt 的基础知识入手,逐步学习安装、核心组件、布局和主题,并提供可运行的示例。
什么是 PyQt?
PyQt的 是一个意念波· Python 它绑定了开源控件工具包 Qt,Qt 也可用作跨平台应用程序开发框架。Qt 是一款流行的…… C++ 用于为所有主流桌面、移动和嵌入式平台编写 GUI 应用程序的框架(它支持 Linux, Windows, macOS, Android、iOS、Raspberry Pi 等等)。
PyQt 是由位于英国的 Riverbank Computing 公司开发和维护的免费软件,而 Qt 则是由一家名为 The Qt Company 的芬兰公司开发的。
PyQt 的特性
以下是 PyQt 的重要特性:
PyQt包含六百多个类,涵盖一系列功能,例如:
- 图形用户界面
- SQL数据库
- Web 工具包
- XML处理
- 社交
这些功能可以组合起来,用于创建高级用户界面以及独立应用程序。许多各行各业的大公司都在使用 Qt,例如 LG、梅赛德斯-奔驰、AMD、松下和哈曼。
PyQt 版本
PyQt 有两个版本:PyQt4 和 PyQt5。PyQt4 提供用于绑定 Qt 框架 4.x 和 5.x 版本的粘合代码,而 PyQt5 仅提供对 Qt 框架 5.x 版本的绑定。因此,PyQt5 与旧版本中已弃用的模块不兼容。在本 PyQt GUI 教程中,我们将使用 PyQt5 来演示示例。除了这两个版本之外,Riverbank Computing 还提供 PyQt3D。 Python Qt3D框架的绑定。Qt3D是一个应用程序框架,用于创建具有2D/3D渲染功能的实时仿真系统。
如何安装 PyQt5
在本 PyQt5 教程中,我们将看到安装 PyQt 的两种方法:
- 使用 Wheel 文件
- 从源代码构建和安装
Qt(发音为 cute)是一个复杂的系统,PyQt 代码库包含已编译的 C++ 和 Python 底层代码较为复杂。因此,与其他软件相比,从源代码构建和安装它的过程较为复杂。 Python 库。不过,您可以使用 wheels 轻松安装 PyQt5。
带轮安装
车轮是新标准 Python 包装和分发格式。简单来说,wheel 是一个具有特殊名称和 的 ZIP 存档。WHL 文件扩展名。可以使用 pip 安装 Wheels (Python的包管理器),默认情况下包含在最新版本的 Python.
所以,如果你有 Python 3.4 或更高版本已安装,则说明您已安装 pip。但是,如果您使用的是旧版本的 Python您必须先下载并安装 pip 才能继续。您可以在此链接中查找相关说明: https://pypi.org/project/pip/.
安装 PyQt5:
步骤1) 打开命令提示符。
在 Windows 机。
步骤2) 输入以下内容。
pip install PyQt5
步骤3) 安装成功。
本 PyQt5 教程中的此步骤将下载 PyQt5 whl 包(约 50 MB)并将其安装到您的系统上。
或者,您也可以下载 Windows 该版本的二进制文件 Python 安装在您的计算机上。
完成后,继续本 PyQt5 教程的下一部分来编写您的第一个 GUI 应用程序。
基本 PyQt Concepts 和计划
现在您已成功在计算机上安装了 PyQt5,可以开始编写代码了。 Python 图形用户界面应用程序。
在本 PyQt5 教程中,我们将从一个简单的应用程序开始,该应用程序将在屏幕上显示一个空白窗口。
启动你的 Python IDLE 并输入以下内容:
计划1
import sys from PyQt5.QtWidgets import QApplication, QWidget if __name__ == "__main__": app = QApplication(sys.argv) w = QWidget() w.resize(300,300) w.setWindowTitle("Guru99") w.show() sys.exit(app.exec_())
将其另存为 app.py(文件名无关紧要),然后按 F5 运行程序。或者,只需双击保存的文件即可启动应用程序。如果一切操作正确,将会打开一个标题为“app.py”的新窗口。 Guru如下所示,99。
太棒了!它运行正常。虽然功能不多,但足以掌握基础知识。现在,在本 PyQt 教程中,我们将详细了解程序中每一行代码的作用。
from PyQt5.QtWidgets import QApplication, QWidget
此语句将创建 GUI 所需的所有模块导入到当前命名空间中。QtWidgets 模块包含您将在此中使用的所有主要小部件 Python Qt 教程。
app = QApplication(sys.argv)
在这里,您将创建 QApplication 类的一个对象。此步骤对于 PyQt5 来说是必需的;每个 UI 应用程序都必须创建一个 QApplication 实例,作为应用程序的一种入口点。如果您不创建它,则会显示错误。
sys.argv 是您通过 shell 启动应用程序或自动化界面时可以传递给应用程序的命令行参数列表。
在这个 PyQt5 示例中,您没有向 QApplication 传递任何参数。因此,您也可以用下面的代码替换它,甚至无需导入 sys 模块。
app = QApplication([])
w = QWidget()
接下来,我们创建一个 QWidget 类的对象。QWidget 是 Qt 中所有 UI 对象的基类,您在应用程序中看到的几乎所有东西都是小部件。其中包括对话框、文本、按钮、栏等。允许您设计复杂用户界面的功能是小部件可以嵌套,即,您可以将一个小部件放在另一个小部件内,而这个小部件又放在另一个小部件内。您将在下一节中看到这一点。
w.resize(300,300)
QWidget 类的 resize 方法允许您设置任何小部件的尺寸。在本例中,您已将窗口大小调整为 300px x 300px。
这里需要记住的是,控件可以嵌套在一起;最外层的控件(即没有父控件的控件)称为窗口。
w.setWindowTitle("Guru99")
`setWindowTitle()` 方法允许您传递一个字符串作为参数,该方法会将窗口标题设置为您传递的字符串。在 PyQt5 示例中,标题栏将显示 Guru99.
w.show()
show() 只是在监视器屏幕上显示小部件。
sys.exit(app.exec_())
app.exec_() 方法启动 Qt/C++ 事件循环。如你所知,PyQt 大部分是用 C++ 它使用事件循环机制来实现并行执行。`app.exec_()` 将控制权交给 Qt,Qt 只会在用户通过 GUI 关闭应用程序时才会退出。这就是为什么按 Ctrl+C 不会像在其他应用程序中那样退出应用程序的原因。 Python 程序。由于 Qt 控制着应用程序, Python 除非我们在应用程序内部进行设置,否则事件不会被处理。另外,请注意 exec 方法名称中带有下划线;这是因为 exec() 已经是关键字了。 Python 下划线解决了命名冲突。
超越空窗户
在上一节中,您学习了如何在 Qt 中创建一个基本控件。现在是时候创建一些更复杂的界面,让用户可以真正与之交互了。再次启动您的 Qt 项目。 IDLE 并写下以下内容。
import sys from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QMessageBox def dialog(): mbox = QMessageBox() mbox.setText("Your allegiance has been noted") mbox.setDetailedText("You are now a disciple and subject of the all-knowing Guru") mbox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) mbox.exec_() if __name__ == "__main__": app = QApplication(sys.argv) w = QWidget() w.resize(300,300) w.setWindowTitle("Guru99") label = QLabel(w) label.setText("Behold the Guru, Guru99") label.move(100,130) label.show() btn = QPushButton(w) btn.setText('Beheld') btn.move(110,150) btn.show() btn.clicked.connect(dialog) w.show() sys.exit(app.exec_())
将文件另存为 appone.py 或其他你喜欢的名称,然后按 F5 运行程序。如果没有出错, IDLE 将打开一个新窗口,其中包含一些文本和一个按钮,如下所示。
- 一旦您单击第一个窗口中的按钮,就会弹出一个新的消息框,其中包含您所写的文本。
- 您现在可以单击“隐藏详细信息”/“显示详细信息”按钮来切换附加文本的可见性。
如您所见,由于我们没有在消息框中设置任何窗口标题,因此系统提供了一个默认标题。 Python 本身。
既然它已经可以运行了,让我们来看看您在之前的 PyQt5 示例中添加的额外代码。
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QMessageBox
这将导入您在 PyQt5 示例中使用的一些小部件,即 QLabel、QPushButton 和 QMessageBox.
def dialog(): mbox = QMessageBox() mbox.setText("Your allegiance has been noted") mbox.setDetailedText("You are now a disciple and subject of the all-knowing Guru") mbox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) mbox.exec_()
这里,您定义了一个名为 dialog 的方法,它创建一个消息框小部件并将一些文本设置到按钮和其他字段。
当按下特定小部件(本例中为 btn PushButton)中的按钮时,程序的主块会调用 dialog 方法。该按钮上触发的单击事件会导致执行此函数。此类函数在 Qt 中称为槽,您将了解有关 信号 和 插槽 在接下来的段落中。
if __name__ == "__main__": app = QApplication(sys.argv) w = QWidget() w.resize(300,300) w.setWindowTitle("Guru99")
这是应用程序的主要部分,与前面的示例一样,首先创建一个 QApplication 实例,然后创建一个简单的控件,即一个 QWidget 实例。
label = QLabel(w)
btn = QPushButton(w)
您已在此应用程序中添加了两个新小部件:QLabel 和 QPushButton。QLabel 用于打印小部件内的不可编辑文本或占位符,而 QPushButton 用于创建可点击的按钮。
这里要注意的关键一点是,当您创建标签和 btn 对象时,您会将窗口对象 (w) 传递给 QLabel 和 QPushButton 的构造函数。这就是 PyQt5 中嵌套的工作方式。要在另一个小部件内创建一个小部件,您需要将父小部件的引用传递给子小部件的构造函数。
label.move(100,130) btn.move(110,150)
move() 用于设置窗口小部件相对于其父窗口小部件的位置。在第一种情况下,标签将从窗口左侧移动 100px,从窗口顶部移动 130px。
类似地,按钮将放置在窗口左侧 110px 和顶部 150px 处。此示例是实现布局的粗略方法,通常不会在生产中使用;它仅用于学习目的。Qt 支持不同的布局,您将在本 PyQt 教程的后续部分中详细了解这些布局。
btn.clicked.connect(dialog)
最后,这里举一个 Qt 中信号和槽的例子。在基于 GUI 的应用程序中,函数会根据用户执行的操作来执行,例如将鼠标悬停在某个元素上或单击按钮。这些操作被称为信号和槽。 事件。回想一下,app.exec_() 方法将控制权转移到 Qt 活动 循环。这就是事件循环的作用:监听事件并执行相应的操作。
每当发生事件时(例如用户单击按钮),相应的 Qt 小部件就会引发 信号. 这些信号可以连接到 Python 功能 (如本例中的 dialog 函数),这样当信号触发时,该函数就会执行。这些函数被称为 插槽 用 Qt 术语来说。
因此,响应事件信号触发槽函数的基本语法如下:
widget.signal.connect(slot)
这意味着每当 信号 由 小部件,已连接 插槽 函数将会被执行。总之,信号和槽是 Qt 用于对象间通信并促进组件重用性和交互性的工具。
现在您知道了如何嵌套小部件并使用信号和槽实现交互,这里列出了您可以在 PyQt 应用程序中使用的有用的小部件和其他类。
组件和小部件
PyQt 中有大量可用于创建 GUI 应用程序的小部件。然而,在 PyQt5 中,类被重新划分为不同的模块,并且许可证也进行了修订。
因此,对 PyQt5 的结构有一个宏观的了解至关重要。在本节中,您将了解 PyQt5 的内部组织结构,并学习 PyQt5 提供的不同模块、库和 API 类。
PyQt5 目录结构
这些是使用的基本模块 Python的 Qt 绑定,特别是 PyQt5。
- Qt它将下面提到的所有类/模块合并到一个模块中。这会显著增加应用程序的内存使用量。但是,只导入一个模块可以更轻松地管理框架。
- Qt核心:包含其他模块使用的核心非图形类。Qt 事件循环、信号和插槽连接等就是在这里实现的。
- QtWidgets:包含 PyQt5 中大部分可用的控件。
- 图形界面:包含GUI组件并扩展QtCore模块。
- Qt网络:包含用于通过 Qt 实现网络编程的类。它支持 TCP 服务器、TCP 套接字、UDP 套接字、SSL 处理、网络会话和 DNS 查找。
- Qt多媒体提供底层多媒体功能。
- 数据库:实现 SQL 数据库的数据库集成。支持 ODBC、 MySQL, Oracle, SQLite和 PostgreSQL.
PyQt5 小部件
以下是 PyQt5 中最常用的控件列表:
- 編輯:这是一个输入字段,允许用户输入一行文本。
line = QLineEdit()
- 按钮这是一个带有可选按钮的输入字段,类似于 HTML 中的单选按钮。
rad = QRadioButton("button title") rad.setChecked(True) #to select the button by default.
- 韓式拼音Box:用于显示带有可选项目列表的下拉菜单。
drop = QComboBox(w) drop.addItems(["item one", "item two", "item three"])
- 质检Box:在标签前显示一个可选择的方框,选中即为勾选,类似单选按钮。
check = QCheckBox("button title")
- 菜单栏它会在窗口顶部显示一个水平菜单栏。您只能向此菜单栏添加 QMenu 类的对象。这些 QMenu 对象还可以包含字符串、QAction 对象或其他 QMenu 对象。
- 工具栏:它是可以在窗口内移动的水平栏或窗格。它可能包含按钮和其他小部件。
- Q选项卡它用于将窗口内容拆分成多个页面,这些页面可以通过控件顶部的不同标签页进行访问。它由两部分组成:标签栏和标签页。
- 滚动条它用于创建滚动条,使用户能够在窗口中上下滚动。它由一个可移动的滑块和一个滑块组成。 track,以及两个用于向上或向下滚动滑块的按钮。
scroll = QScrollBar()
- 分割器:分割器用于分隔窗口的内容,以便正确分组小部件,不会显得杂乱。QSplitter 是 PyQt5 中可用的主要布局处理程序之一,用于水平和垂直分割内容。
- QDock停靠窗口是一个子窗口,它有两个属性:它可以在主窗口内移动,也可以停靠在父窗口之外的屏幕上的其他位置。
布局和主题
在前面的 PyQt5 示例中,您仅使用 move() 和 resize() 方法来设置 GUI 中小部件的位置。
但是,PyQt 有一个强大的布局管理引擎,可用于为应用程序创建高级用户界面。在本节中,您将了解 Qt 中用于创建和管理布局的两个重要类。
- QBox布局
- 网格布局
QBox布局
QBox布局用于将布局的子控件按水平或垂直方向对齐。从 Q 继承的两个感兴趣的类Box布局如下:
- QHBox布局:用于水平排列子窗口小部件。
- QVBox布局:用于垂直排列子部件。
例如,这是三个按钮与 QH 对齐的方式Box布局将会看起来。
import sys from PyQt5.QtWidgets import * if __name__ == "__main__": app = QApplication([]) w = QWidget() w.setWindowTitle("Musketeers") btn1 = QPushButton("Athos") btn2 = QPushButton("Porthos") btn3 = QPushButton("Aramis") hbox = QHBoxLayout(w) hbox.addWidget(btn1) hbox.addWidget(btn2) hbox.addWidget(btn3) w.show() sys.exit(app.exec_())
它们在 QV 中的样子如下Box布局。
import sys from PyQt5.QtWidgets import * if __name__ == "__main__": app = QApplication([]) w = QWidget() w.setWindowTitle("Musketeers") btn1 = QPushButton("Athos") btn2 = QPushButton("Porthos") btn3 = QPushButton("Aramis") vb = QVBoxLayout(w) vb.addWidget(btn1) vb.addWidget(btn2) vb.addWidget(btn3) w.show() sys.exit(app.exec_())
此时唯一需要解释的函数是 addWidget() 方法。它用于将小部件插入 HBox 或VBox 布局。它还用于其他布局,这些布局需要不同数量的参数,正如您将在下一节中看到的那样。小部件将按照您插入它们的顺序出现在布局中。
网格布局
QGridLayout 用于创建以网格形式(如矩阵或二维数组)布置小部件的界面。要在网格布局中插入元素,可以使用矩阵表示来定义网格中的行数和列数以及这些元素的位置。
例如,要创建一个 3*3 的网格(即具有三行三列的网格),您将编写以下代码:
Import sys from PyQt5.QtWidgets import * if __name__ == "__main__": app = QApplication([]) w = QWidget() grid = QGridLayout(w) for i in range(3): for j in range(3): grid.addWidget(QPushButton("Button"),i,j) w.show() sys.exit(app.exec_())
这将是输出:
网格布局中的 addWidget() 方法接受以下参数:
- 您想要添加到网格的小部件对象
- 对象的 x 坐标
- 对象的 y 坐标
- 行跨度(默认值 = 0)
- col-span(默认值 = 0)
为了更好地理解,您可以像下面这样手动插入每个小部件。
import sys from PyQt5.QtWidgets import * if __name__ == "__main__": app = QApplication([]) w = QWidget() grid = QGridLayout(w) grid.addWidget(QPushButton("Button one"),0,0) grid.addWidget(QPushButton("Button two"),0,1) grid.addWidget(QPushButton("Button three"),1,0) grid.addWidget(QPushButton("Button four"),1,1) w.show() sys.exit(app.exec_())
网格看起来如下:
您还可以将 rowspan 和 colspan 参数传递给 addWidget() 以跨越多行或多列。
例如,
grid.addWidget(QPushButton("Button five"),2,0,1,0)
这将创建一个横跨两列的按钮。
主题
PyQt5 附带一些可在应用程序中使用的内置主题。 设置样式() 在 QApplication 实例上调用的方法用于为您的应用程序设置特定主题。
例如,添加以下代码行会将应用程序的主题从默认主题更改为 Fusion 主题。
app.setStyle("Fusion")
这就是前面示例在 Fusion 主题中的显示效果。
另一个用于应用主题化的实用函数是 setPalette() 方法。以下代码展示了如何使用 setPalette() 更改不同组件的颜色。
import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import * from PyQt5.QtGui import QPalette if __name__ == "__main__": app = QApplication([]) app.setStyle("Fusion") qp = QPalette() qp.setColor(QPalette.ButtonText, Qt.black) qp.setColor(QPalette.Window, Qt.black) qp.setColor(QPalette.Button, Qt.gray) app.setPalette(qp) w = QWidget() grid = QGridLayout(w) grid.addWidget(QPushButton("Button one"),0,0) grid.addWidget(QPushButton("Button two"),0,1) grid.addWidget(QPushButton("Button three"),1,0) grid.addWidget(QPushButton("Button four"),1,1) w.show() sys.exit(app.exec_())
这是结果。
要使用 setPalette() 方法,首先需要定义一个调色板。这可以通过创建 QPalette 类的对象来完成。
qp = QPalette()
请注意,QPalette 类属于 QtGui 模块,您需要导入它才能使其正常工作。创建 QPalette 对象后,使用 setColor() 方法传入要更改颜色的控件名称和要设置的颜色值。
qp.setColor(QPalette.Window, Qt.black)
这将把窗口颜色更改为黑色。定义好配色方案后,使用 `setPalette()` 函数将调色板应用到您的应用程序。
app.setPalette(qp)
如果您想要为应用创建一些基本主题,那么这就是您需要做的全部工作。PyQt 还允许您使用样式表来定义小部件的外观。如果您熟悉 CSS,则可以使用 Qt 样式表轻松为您的应用定义高级样式。












