Python开发GUI常用库PyQt6和PySide6介绍之一:简介与安装

Python开发GUI常用库PyQt6和PySide6介绍之一:简介与安装

Python开发GUI常见选择

Python开发GUI有许多选择,下面是常见的选择:

Tkinter:Tkinter是Python标准库中的一个GUI工具包,易于学习和使用。它提供了丰富的组件和布局选项,适用于简单的GUI应用程序。Tkinter的优点是它与Python的集成非常紧密,不需要额外的安装。然而,它在外观和功能方面可能相对较简单,并且缺乏一些现代GUI框架的高级功能。

基于tkinter的GUI编程,在以前文章中已介绍比较多:

Python 的Tkinter包系列之一:窗口初步 https://blog.csdn.net/cnds123/article/details/127227651

Python 的Tkinter包系列之二:菜单  https://blog.csdn.net/cnds123/article/details/127319885

Python 的Tkinter包系列之三:Canvas(画布)https://blog.csdn.net/cnds123/article/details/127344534

Python 的Tkinter包系列之四:对话框 https://blog.csdn.net/cnds123/article/details/127392512

Python 的Tkinter包系列之五:事件  https://blog.csdn.net/cnds123/article/details/127411016

python 的Tkinter包系列之六:好例子  https://blog.csdn.net/cnds123/article/details/127487982

在此就不多说了。

PyQt:PyQt是一个功能强大且成熟的GUI框架,基于Qt库。它提供了丰富的组件、布局和主题选项,以及强大的功能和灵活性。PyQt的优点是它具有现代化的外观和丰富的功能,适用于复杂的GUI应用程序。然而,由于PyQt的许可证问题,您需要确保在使用之前了解和遵守相关的许可条款。

PySide6:PySide6是Qt的另一个Python绑定,与PyQt类似,但使用了更宽松的许可证(LGPL)。它提供了与PyQt相似的功能和API,因此如果您熟悉PyQt,可以很容易地切换到PySide6。与PyQt相比,PySide6的社区支持可能相对较少,但它仍然是一个可行的选择。

PyQt6和PySide6它们是由不同的组织开发和维护的。PyQt6是由Riverbank Computing开发和支持的,提供了与Qt C++版本相似的功能和API,并且与Qt官方的兼容性很高。PySide6是由Qt公司(The Qt Company)开发和支持的,是Qt官方推荐的Python绑定库,与Qt框架紧密集成,具有与Qt C++版本的高度兼容性。

【当软件开发者提到"Qt"时,它可以指两个不同的事物:Qt指The Qt Company,也指Qt开发框架:

1、Qt公司(The Qt Company):这是一家软件公司,主要负责开发和维护Qt开发框架。Qt公司提供商业许可和支持服务,并积极推动Qt的发展和创新。

2、Qt开发框架:这是由Qt公司开发的跨平台的应用程序和用户界面开发框架。Qt开发框架提供了丰富的工具、类库和API,使开发人员能够以一致的方式构建高效、现代和可扩展的应用程序。

当软件开发者提到"Qt"时,需要根据上下文来确定是指Qt公司还是Qt开发框架。】

PyQt6和PySide6基本概念

这一部分先给出yQt6和PySide6的总体概观,大体了解即可,在学习了会面相关介绍后,回头看时就容易懂了。

PyQt6和PySide6都是用于创建基于Qt框架的Python图形用户界面(GUI)应用程序的工具包。它们提供了访问Qt功能和组件的接口,使开发者能够使用Python语言轻松创建跨平台的GUI应用程序。PyQt6是由Riverbank Computing开发和维护的,而PySide6是由Qt公司开发和维护的。

PyQt6提供两种许可证:一种是商业许可证,如果你想在你的应用程序中使用PyQt6而不公开源代码,你需要购买这种许可证。另一种是GNU通用公共许可证(GPL,General Public License),如果你的应用程序也是开源并且遵循GPL许可证,你可以免费使用PyQt6。

PySide6则是基于LGPL(Lesser General Public License)许可证,这意味着你可以在你的应用程序中免费使用PySide6,它不要求你的应用程序必须开源。但是,如果你修改了PySide6的源代码,那么根据LGPL的要求,你必须将这些修改公开。

如果您对GUI开发有较少经验或需要一个简单的界面,Tkinter可能是一个不错的选择。如果您需要更复杂的功能和现代化的外观,PyQt和PySide6都是不错的选择,但您需要对许可证问题进行评估和决策。

由于历史原因,PyQt和PySide在某些情况下具有不同的API和用法。虽然它们都可以用于创建Qt应用程序,但在具体的代码编写和使用上可能会有一些差异。以下是一些可能的差异:

☆模块导入:在导入PyQt和PySide模块时,存在差异。在PyQt中,通常使用import PyQt6.QtCore、import PyQt6.QtGui等方式导入模块。而在PySide中,通常使用import PySide6.QtCore、import PySide6.QtGui等方式导入模块。

☆类和函数名称:在某些情况下,PyQt和PySide使用不同的类和函数名称。例如,在处理事件循环时,PyQt使用QCoreApplication类,而PySide使用QtCore.QCoreApplication类。这种差异可能需要在代码中进行适当的调整。

☆信号与槽机制:PyQt和PySide在信号与槽机制方面存在一些差异。尽管它们都使用信号和槽来处理对象之间的通信,但在具体的语法和用法上可能会有一些不同。有些代码可能需要在从PyQt迁移到PySide时进行修改。“信号和槽”是Qt框架中一种用于实现对象间通信的机制,用于处理GUI事件、线程间通信、网络通信等各种场景。

☆底层细节:由于PyQt和PySide是由不同的团队开发和维护的,它们在底层实现和内部细节上可能存在差异。这些差异可能在一些高级使用场景或特定功能的使用中显现出来。

尽管存在一些差异,但PyQt和PySide都遵循Qt框架的设计原则和API约定,因此在大多数情况下,它们的代码是相似的。对于大多数Qt应用程序开发者来说,这些差异不会对使用体验产生重大影响,而且通常可以通过简单的修改来处理。

在选择使用PyQt还是PySide时,您可以考虑许可证要求、文档和社区支持等因素,以及个人和团队的偏好。在迁移或切换工具包时,建议查阅相关的文档和资源,以了解具体的差异和迁移指南。

PyQt6官方文档:https://www.riverbankcomputing.com/static/Docs/PyQt6/

PySide6官方文档https://doc.qt.io/qtforpython-6/

PySide6所占用的空间大小取决于你所选择的安装方式和你的操作系统,大约需要200-300 MB的磁盘空间。PyQt6和pyqt6-tools所占用的空间的大小取决于它们的版本以及你的操作系统。一般来说PyQt6的安装包大约在30-50MB之间,而pyqt6-tools则大约在80-100MB之间。

信号(Signal)和槽Slot

信号(Signal)和槽Slot)是PyQt6和PySide6中实现对象间通信的基础机制。

信号(Signal):当特定事件发生时,Qt的GUI部件(例如按钮、滑块等)会发出信号。例如,当用户点击一个按钮时,该按钮就会发出一个clicked信号。信号只是一个事件的声明,并不包含具体的处理。

槽(Slot):槽是一个函数,它是对信号的响应,也就是当信号被发出时,应该调用哪个函数进行处理。槽可以是任何Python函数或者Qt方法。

信号和槽的连接(Connection)是在运行时完成的。当一个带有槽的对象接收到它所连接的信号时,它的那个槽就会被调用。

信号与槽机制示意图如下图:

在PyQt6和PySide6中的窗口控件类中有很多内置信号和槽,开发者也可以添加自定义信号和槽。

信号与槽具有如下特点:

1、一个信号可以连接多个槽:这意味着当一个信号发出时,所有连接到该信号的槽函数都会依次被调用。

2、一个信号可以连接另一个信号:这使得你可以创建信号链,使得一个信号的发出会触发其他信号的发出。

3、信号参数可以是任何Python类型:确实如此,这是通过使用PyQt和PySide的pyqtSignal和Signal类并在其中指定参数类型来实现的。

4、一个槽可以监听多个信号:就是说,一个槽函数可以连接到多个信号,当任何一个连接的信号发出时,这个槽函数都会被调用。

5、信号与槽的连接方式可以是同步连接,也可以是异步连接:默认情况下,信号和槽的连接是同步的,也就是说,当信号发出时,所有的槽函数会立即并依次被调用。然而,你也可以通过指定连接类型来改变这种行为,例如使用Qt.QueuedConnection可以使得槽函数在事件循环中异步执行。

6、信号与槽的连接可能会跨线程:信号和槽机制支持跨线程的连接,这使得你可以在一个线程中发出信号,然后在另一个线程中处理这个信号。

7、信号可能会断开:你可以使用disconnect方法来断开信号和槽的连接。

以下是一个简单的信号和槽的连接和使用示例:

from PyQt6.QtWidgets import QApplication, QPushButton

app = QApplication([])

#槽函数
def on_button_clicked():
    print("Button clicked!") # 输出消息

button = QPushButton("Click me")
button.clicked.connect(on_button_clicked)  # 连接信号(clicked)与槽(on_button_clicked)
button.show()

app.exec()

这个示例中,我们首先定义了一个槽函数on_button_clicked,它只是简单地输出一条消息。然后,我们创建了一个按钮,并使用clicked信号与槽函数进行连接,通过button.clicked.connect(on_button_clicked)来实现。

当按钮被点击时,clicked信号将被触发,与之关联的槽函数on_button_clicked将被调用,输出一条消息。

提醒,要运行这个示例,需要 已安装PyQt6。

特别说明:"槽"可以是任何可以调用的Python函数或方法。在PyQt6和PySide6中,槽可以分为两类:系统默认提供的槽和自定义的槽。

系统默认提供的槽是指一些预定义的函数或方法,用于处理常见的事件和操作。这些槽通常与特定的控件或操作相关联,例如按钮的点击事件、窗口的关闭事件等。你可以直接使用这些系统默认提供的槽,无需自己编写代码。

例如,在PyQt6中,QApplication类提供了一些系统默认的槽,如quit槽用于退出应用程序,aboutQt槽用于显示关于Qt的信息等。

自定义的槽是由开发者根据应用程序的需求自行定义的函数或方法。通过将自定义的槽与信号进行连接,可以实现特定的操作和逻辑。自定义的槽可以执行任意的代码,如更新界面、处理数据、调用其他函数等。

例如,在上面的示例中,on_button_clicked函数就是一个自定义的槽,用于处理按钮的点击事件。当按钮被点击时,与之关联的槽函数on_button_clicked将被调用,输出一条消息。

PyQt6和PySide6中的槽可以是系统默认提供的槽或自定义的槽。无论是哪种类型的槽,它们都可以与信号进行连接,用于处理事件和实现特定的功能。你可以根据需要选择使用系统默认提供的槽或自定义的槽。

在PyQt6和PySide6中,也可以定义自己的信号。自定义信号通常在类定义中完成,需要使用pyqtSignal(在PyQt6中)或Signal(在PySide6中)来创建。

在PyQt6和PySide6中,信号和槽是一种重要的事件处理机制,主要用于处理用户的交互事件(如点击按钮、选择列表项等),以及程序内部的通信。

基本的信号和槽使用步骤如下:

定义信号:信号是由QObject或其子类(如各种GUI部件)发出的。大多数内置的GUI部件都有一些预定义的信号。例如,QPushButton有一个clicked信号,当用户点击按钮时这个信号就会被发出。此外,你也可以定义自己的信号,方法是在类定义中使用pyqtSignal(PyQt6)或Signal(PySide6)。

from PyQt6.QtCore import QObject, pyqtSignal

class MyObject(QObject):

    my_signal = pyqtSignal()

定义槽:槽是一个函数,它是对信号的响应。当与之连接的信号被发出时,槽就会被调用。你可以使用任何Python函数作为槽,例如:

def my_slot():

    print("Signal received!")

连接信号和槽:你可以使用connect方法将信号连接到槽。当信号被发出时,所有连接到该信号的槽都会被调用。

obj = MyObject()

obj.my_signal.connect(my_slot)

发出信号:你可以使用emit方法来发出信号。当信号被发出时,所有连接到该信号的槽都会被调用。

obj.my_signal.emit()  # 输出: Signal received!

信号和槽还支持一些高级功能,如信号的参数、信号的阻塞和解除阻塞、信号的断开等。通过信号和槽,你可以创建复杂的交互逻辑,将用户的交互事件与程序的响应操作关联起来。

在使用设计师(Designer),也称为Qt 设计师(Qt Designer)时,你可以在图形界面下进行信号-槽的连接,这将在后面(下一讲)介绍。

Windows10中PySide6的安装与简单使用示例

PySide6是Python的一个用于创建桌面应用程序的库,基于Qt6框架。它提供了对Qt Widgets、Qt GUI和Qt Core功能的访问,使开发人员可以使用Python来构建具有图形用户界面(GUI)的应用程序。PySide6具有以下特点:

☆易学易用:PySide6使用与Python相同的语法和编码风格,使得开发人员可以快速上手并开始创建GUI应用程序。

☆强大的功能:PySide6提供了丰富UI控件,包括按钮、文本框、列表框、对话框、绘图、动画等,可以满足各种应用程序的需求。

☆跨平台:基于Qt6框架,PySide6支持多种操作系统,如Windows、macOS、Linux等,使得开发的应用程序可以在多个平台上运行。

☆可视化设计工具:PySide6提供了Designer(设计器),这是一个可视化的界面设计工具。安装了PySide6,就已经安装了Designer(designer.exe)。你可以使用它来创建和布局应用程序的界面,然后将设计好的界面文件与PySide6代码相结合。

要开始使用PySide6,首先需要安装库。可以使用pip来安装。PySide6安装,在cmd中输入命令如下回车:

pip install PySide6

我的电脑中,安装有了多个Python版本,需要指定版本号安装,

具体可参见Python第三方模块(库、包)安装、卸载与查看及常见问题解决(修订)-CSDN博客

还可以使用-i https://mirrors.aliyun.com/pypi/simple/加速,我这里用:

py -3.10 -m pip install -i https://mirrors.aliyun.com/pypi/simple/ PySide6

在Python 的IDEL Shell中用import PySide6 回车,如果没有出现红字就说明安装成功。

以下是一个简单的PySide6应用程序示例:

import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QMessageBox

# 创建应用程序对象
app = QApplication(sys.argv)

# 创建主窗口
window = QMainWindow()
window.setGeometry(300, 300, 400, 300)
window.setWindowTitle("PySide6 应用程序示例") # 设置窗口标题

# 创建按钮
button = QPushButton("Click me!", window)
button.setGeometry(50, 50, 100, 30)  # 设置按钮的位置和大小

# 按钮点击事件的处理函数
def on_button_clicked():
    message_box = QMessageBox()
    message_box.setText("Hello, PySide6!") # 创建一个消息框并显示消息
    message_box.exec()

# 将按钮点击事件与处理函数关联
button.clicked.connect(on_button_clicked)

# 显示窗口
window.show()

# 运行应用程序的事件循环
sys.exit(app.exec())

运行效果如下图:

Windows10中PyQt6的安装与简单使用示例

PyQt6是Python的一个用于创建桌面应用程序的库,基于Qt6框架。它提供了对Qt Widgets、Qt GUI和Qt Core功能的访问,使开发人员可以使用Python来构建具有图形用户界面(GUI)的应用程序。PyQt6具有以下特点:

☆易学易用:PyQt6使用与Python相同的语法和编码风格,使得开发人员可以快速上手并开始创建GUI应用程序。

☆强大的功能:PyQt6提供了丰富UI控件,包括按钮、文本框、列表框、对话框、绘图、动画等,可以满足各种应用程序的需求。

☆跨平台:基于Qt6框架,PyQt6支持多种操作系统,如Windows、macOS、Linux等,使得开发的应用程序可以在多个平台上运行。

特别提示:PyQt6 是你编写程序需要的主要库,通过PyQt6,你可以使用Python创建强大的、具有图形用户界面的桌面应用程序。pyqt6-tools 是一个附加的包,它安装了一些用于开发和调试PyQt6应用程序的工具,提供了一些额外的工具来帮助你更有效地开发和调试PyQt6应用程序。在某些情况下,你可能会需要安装pyqt6-tools,比如当你需要使用Qt Designer或其他工具时。然而,如果你只是编写基本的PyQt6应用程序,可能并不需要安装pyqt6-tools。 

(PyQt6和PySide6在大多数方面非常相似,也有不同,例如PyQt6,并不会同时安装个可视化的界面设计工具,需要另外安装)

要开始使用PyQt6,首先需要安装库。可以使用pip来安装,PyQt6安装,在cmd中输入命令如下回车:

pip install PyQt6

我的电脑中,安装有了多个Python版本,需要指定版本号安装,

具体可参见https://blog.csdn.net/cnds123/article/details/104393385

还可以使用-i https://mirrors.aliyun.com/pypi/simple/加速,我这里用:py -3.10 -m pip install -i https://mirrors.aliyun.com/pypi/simple/ PyQt6

参见下图:

现在介绍一个简单的PyQt6应用程序例子,将前面PySide6例子中的PySide6替换为PyQt6即可,其他代码保持不变:

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QMessageBox

# 创建应用程序对象
app = QApplication(sys.argv)

# 创建主窗口
window = QMainWindow()
window.setGeometry(300, 300, 400, 300)
window.setWindowTitle("PyQt6 应用程序示例") # 设置窗口标题

# 创建按钮
button = QPushButton("Click me!", window)
button.setGeometry(50, 50, 100, 30)  # 设置按钮的位置和大小

# 按钮点击事件的处理函数
def on_button_clicked():
    message_box = QMessageBox()
    message_box.setText("Hello, PyQt6!") # 创建一个消息框并显示消息
    message_box.exec()

# 将按钮点击事件与处理函数关联
button.clicked.connect(on_button_clicked)

# 显示窗口
window.show()

# 运行应用程序的事件循环
sys.exit(app.exec())

运行效果类似。由此可知,PyQt6与PySide6在使用上基本相同,具有相似的API和功能。 你可以试试,在此就不给出运行效果图了。

注意:在同一个Python程序中建议只使用PyQt或PySide之一。同一个Python程序中尝试使用它们,可能会出现一些问题。例如:如果你在同一个Python文件中同时导入了PyQt和PySide的相同模块,Python可能会混淆两者,导致导入错误或难以预测的行为。

猜你喜欢

转载自blog.csdn.net/cnds123/article/details/135069944