PyQt5 教程与示例:使用 PyQt 设计 GUI Python

什么是 PyQt?

PyQt的 是开源小部件工具包 Qt 的 Python 绑定,它也可用作跨平台应用程序开发框架。Qt 是一种流行的 C++ 为所有主流桌面、移动和嵌入式平台编写 GUI 应用程序的框架(支持 Linux、 Windows, 苹果系统, Android、iOS、Raspberry Pi 等等)。

PyQt 是一款免费软件,由位于英国的公司 Riverbank Computing 开发和维护,而 Qt 则由一家名为 The Qt Company 的芬兰公司开发。

PyQT 的功能

以下是 PyQt 的重要特性:

学习 PyQt,它包含六百多个课程,涵盖一系列功能,例如

  • 图形用户界面
  • SQL数据库
  • Web 工具包
  • XML处理
  • 网络

这些功能可以组合起来创建高级 UI 以及独立应用程序。各行各业的许多大公司都在使用 Qt。例如 LG、梅赛德斯、AMD、松下、哈曼等。

PyQt 版本

PyQt 有两个版本:PyQt4 和 PyQt5。PyQt4 提供粘合代码,用于绑定 Qt 框架的 4.x 和 5.x 版本,而 PyQt5 仅提供绑定 5.x 版本。因此,PyQt5 不向后兼容旧版本的弃用模块。在本 Qt GUI 教程中,将使用 PyQt5 来演示示例。除了这两个版本之外,

Riverbank Computing 还提供 PyQt3D — Qt3D 框架的 Python 绑定。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 机。

安装 PyQt5

步骤2) 输入以下内容。

 pip install PyQt5

步骤3) 安装成功。
本 PyQt5 教程中的此步骤将下载 PyQt5 whl 包(约 50 MB)并将其安装到您的系统上。

安装 PyQt5

或者,您也可以下载 Windows 您的计算机上安装的 python 版本的二进制文件。

完成后,继续本 PyQt5 教程的下一部分来编写您的第一个 GUI 应用程序。

基本 PyQt Concepts 和计划

现在您已在计算机上成功安装了 PyQt5,您可以编写 Python GUI 设计应用程序。

让我们从本 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 运行该程序。或者,只需双击保存的文件即可启动该应用程序。如果您正确完成所有操作,将打开一个新窗口,标题为 Guru99,如下所示。

基本 PyQt Concepts

太棒了!它正在运行。虽然不多,但足以掌握基础知识。现在,在这个 PyQt 教程中,让我们详细了解程序中每一行的作用。

from PyQt5.QtWidgets import QApplication, QWidget

此语句将创建 GUI 所需的所有模块导入到当前命名空间中。QtWidgets 模块包含您将在此中使用的所有主要小部件 Python Qt 教程。

app = QApplication(sys.argv)

在这里,您将创建 QApplication 类的一个对象。此步骤对于 PyQt5 来说是必需的;每个 UI 应用程序都必须创建一个 QApplication 实例,作为应用程序的一种入口点。如果您不创建它,则会显示错误。

sys.argv 是您通过 shell 启动应用程序或自动化界面时可以传递给应用程序的命令行参数列表。

在这个 PyQt5 示例中,您没有向 QApplications 传递任何参数。因此,您也可以用下面的代码替换它,甚至不必导入 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,只有当用户从 GUI 关闭应用程序时,Qt 才会退出应用程序。这就是为什么 ctrl+c 不会像在其他 Python 程序中一样退出应用程序的原因。由于 Qt 控制着应用程序,因此除非我们在应用程序内部设置 Python 事件,否则不会处理它们。另外,请注意 exec 方法的名称中有一个下划线;这是因为 exec() 已经是 Python 中的关键字,下划线解决了命名冲突。

超越空窗户

在上一节中,您了解了如何在 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 将打开一个新窗口,其中包含一些文本和一个按钮,如下所示。

超越空虚 Windows

  1. 一旦您单击第一个窗口中的按钮,就会弹出一个新的消息框,其中包含您所写的文本。
  2. 您现在可以单击“隐藏详细信息”/“显示详细信息”按钮来切换附加文本的可见性。

如您所见,由于我们没有在消息框中设置任何窗口标题,因此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 目录结构

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选项​​卡:用于将窗口内容拆分为多个页面,可通过窗口小部件顶部的不同选项卡访问这些页面。它由两部分组成:选项卡栏和选项卡页。
  • 滚动条:用于创建滚动条,允许用户在窗口内上下滚动。它由一个可移动的滑块、一个滑块轨道和两个用于上下滚动滑块的按钮组成。
    scroll = QScrollBar()
  • 分割器:分割器用于分隔窗口的内容,以便正确分组小部件,不会显得杂乱。QSplitter 是 PyQt5 中可用的主要布局处理程序之一,用于水平和垂直分割内容。
  • QDock:Dock 小部件是具有两个属性的子窗口:
  • 它可以在主窗口内移动,并且
  • 它可以停靠在父窗口外面的屏幕上的另一个位置。

布局和主题

在前面的 PyQt5 示例中,您仅使用 move() 和 resize() 方法来设置 GUI 中小部件的位置。

但是,PyQt 有一个强大的布局管理引擎,可用于为应用程序创建高级用户界面。在本节中,您将了解 Qt 中用于创建和管理布局的两个重要类。

  1. QBox布局
  2. 网格布局

QBox布局

QBox布局用于将布局的子控件按水平或垂直方向对齐。从 Q 继承的两个感兴趣的类Box布局如下:

  • QHBox布局:用于水平排列子窗口小部件。
  • QVBox布局:用于垂直排列子部件。

例如,这是三个按钮与 QH 对齐的方式Box布局将会看起来。

QBox布局

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布局。

QBox布局

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)
  • 列跨度(默认=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 样式表轻松为您的应用定义高级样式。

总结

  • PyQt 是 C++ UI框架,Qt。
  • PyQt4 和 PyQt5 是 Riverbank Computing 开发的两个主要版本。
  • PyQt框架的主要模块有:
    1. Qt
    2. Qt核心
    3. QtWidgets
    4. 图形界面
    5. 数据库
    6. Qt网络
  • PyQt 支持各种小部件,例如:
    1. 钮扣
    2. 文本标签
    3. 文字栏位
    4. 单选按钮和复选框
    5. 工具栏和菜单栏
    6. 网页套件
    7. 标签
    8. 码头
  • 在 PyQt 中,交互性是使用以下方式实现的: 信号插槽。
  • An 活动 是用户在 GUI 中执行的操作(如单击按钮)。
  • A 信号 当相应小部件上发生事件时,会引发此事件。
  • A 插槽 是一个与信号相连并在信号发出时执行的函数。
  • PyQt 具有强大的布局引擎,并支持高级布局设计和管理。以下是 PyQt 中两种常用的布局方案:
    1. Box 布局
    2. 网格布局
  • PyQt 设计器允许您为 GUI 应用程序创建自定义主题,并内置对样式表的支持。
  • Qt创建者 Python 可用于创建用户界面以及独立应用程序。