什么是PyQt? PyQt是开源widget-toolkit Qt的python绑定,它也可以作为跨平台的应用程序开发框架。Qt是一个流行的C ++框架,用于为所有主要的桌面,移动和嵌入式平台编写GUI应用程序(支持Linux,Windows,MacOS,Android,iOS,Raspberry Pi等)。 PyQt由位于英格兰的Riverbank Computing公司开发和维护,而Qt则由一家名为The Qt Company的芬兰公司开发。 在这个PyQT教程中,您将学习:
PyQT的特点 这里是PyQt的重要功能: PyQt包含六百多个类,涵盖了一系列功能,如:
可以组合这些功能来创建高级UI以及独立应用程序。很多行业的许多大公司都在使用Qt。 PyQt版本 PyQt有两个版本,PyQt4和PyQt5。PyQt4提供了粘接代码,用于绑定Qt框架的4.x和5.x版本,而PyQt5仅为5.x版本提供绑定。因此,PyQt5不能与旧版本的已弃用模块向后兼容。在本教程中,PyQt5将用于演示示例。除了这两个版本,Riverbank Computing还提供PyQt3D- Qt3D框架的python绑定。Qt3D是一个应用程序框架,用于创建具有2D / 3D渲染的实时仿真系统。 如何安装PyQt 安装PyQt有两种方法。
Qt是一个复杂的系统,PyQt代码库包含引擎编译的C ++和Python代码。因此,与其他python库相比,从源代码构建和安装它是一个复杂的过程。但是,您可以使用wheel轻松安装PyQt5。 使用wheel安装wheel是新的标准Python包装和分发格式。简单来说,一个wheel是一个ZIP,有一个特殊的名称和。whl文件扩展名。可以使用pip(Python的包管理器)安装wheel,默认情况下,它包含在最新版本的Python中。 因此,如果您安装了Python 3.4或更高版本,那么您已经拥有了pip。但是,如果您使用的是旧版本的Python,则必须在继续之前下载并安装pip。您可以在以下链接中搜索相关说明:https://pypi.org/project/pip/。 要安装PyQt5, 步骤1)在Windows计算机中打开命令提示符或PowerShell。 ![]() 步骤2)键入以下内容 1 pip install PyQt5 步骤将下载PyQt5 whl软件包(大约50 MB)并将其安装在您的系统上。 ![]() 或者,您也可以下载计算机上安装的python版本的Windows二进制文件。完成后,继续下一部分编写第一个GUI应用程序。 基本的PyQt概念和程序 现在您已经在计算机中成功安装了PyQt5,您已准备好在python中编写GUI应用程序。让我们从一个简单的应用程序开始,它将在屏幕上显示一个空窗口。启动你的python IDLE并输入以下内容: 1import sys 将其保存为app.py,并点击F5运行该程序。或者,只需双击保存的文件即可启动该应用程序。如果你的操作一切正确,将打开一个新窗口,标题为Guru99,如下所示。 ![]() 现在,让我们详细了解程序中的每一行。 1from PyQt5.QtWidgets import QApplication, QWidget 此语句将创建GUI所需的所有模块导入当前命名空间。QtWidgets模块包含您将在本教程中使用的所有主要widgets。 1app = QApplication(sys.argv) 在这里,您将创建QApplication类的对象。这一步是PyQt5的必要条件; 每个UI应用程序都必须创建一个QApplication实例,作为应用程序的一种入口点。如果您不创建它,将显示错误。sys.argv是命令行参数的列表,您可以在通过shell启动或自动化接口时将其传递给应用程序。在此示例中,没有将任何参数传递给QApplications。因此,您也可以使用下面的代码替换它,甚至不必导入sys模块。 1app = QApplication([]) 1w = QWidget() 接下来,我们创建一个QWidget类的对象。QWidget是Qt中所有UI对象的基类,实际上您在应用中看到的所有内容都是一个Widget。包括对话框,文本,按钮,条形图等。允许您设计复杂用户界面的功能是窗口widget可以嵌套,即,您可以在窗口widget内部放置一个窗口小部件,该窗口widget位于另一个窗口widget内。您将在下一节中看到这一点。 1w.resize(300,300) QWidget类的resize方法允许您设置任何窗口widget的尺寸。在这种情况下,您已将窗口的大小调整为300px×300px。在这里,您应该记住窗口widget可以嵌套在一起,最外面的窗口widget(即没有父窗口的窗口widget)称为窗口。 1w.setWindowTitle('Guru99') setWindowTitle()方法允许您将字符串作为参数传递,该参数将窗口的标题设置为您传递的字符串。在示例中,标题栏将显示Guru99。 1w.show() show()只是在监视器屏幕上显示。 1sys.exit(app.exec_()) app.exec_()方法启动Qt / C ++事件循环。如您所知,PyQt主要使用C ++编写,并使用事件循环机制来实现并行执行。app.exec_()将控制传递给Qt,只有当用户从GUI关闭它时才会退出应用程序。这就是为什么ctrl + c不会像在其他python程序中一样退出应用程序。由于Qt可以控制应用程序,因此除非我们在应用程序中设置python事件,否则不会处理它们。另请注意,exec方法的名称中有下划线; 这是因为exec()已经是python中的关键字,下划线解决了命名冲突。 空窗口在上一节中,您了解了如何在Qt中创建基本widget。现在是时候制作一些更加丰富的界面了。再次,启动你的IDLE并写下以下内容。 1import sys 将文件另存为appone.py或任何您喜欢的文件,然后按F5运行该程序。如果您没有犯任何错误,IDLE将打开一个带有一些文本和按钮的新窗口,如下所示。 ![]()
1from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QMessageBox 这会导入您在此示例中使用的更多widgets,即QLabel,QPushButton和QMessageBox。 1def dialog(): 在这里,您已经定义了一个名为dialog的方法,该方法创建一个消息框并将一些文本设置为按钮和其他字段。当在特定widget(在这种情况下,btn PushButton)中按下按钮时,从程序的主块调用对话框方法。在该按钮上触发的单击事件会导致执行此功能。这样的函数在Qt中称为插槽,您将在后续段落中了解有关信号和槽的更多信息。 1if __name__ == "__main__": 这是应用程序的主要部分,与前面的示例一样,您首先要创建一个QApplication实例,然后是一个简单的widget,即QWidget的一个实例。 1 label = QLabel(w) 您已在此应用程序中添加了两个新widgets:QLabel和QPushButton。QLabel用于在窗口中打印不可编辑的文本或占位符,而QPushButton用于创建可单击的按钮。这里需要注意的关键是,当您创建标签和btn对象时,您将窗口对象(w)传递给QLabel和QPushButton的构造函数。这就是嵌套在PyQt5中的工作原理。要在另一个窗口中创建窗口,请将父窗口的引用传递给子窗口的构造函数。 1label.move(100,130) move()用于设置窗口相对于其父窗口的位置。在第一种情况下,标签将从左侧移动100px,从窗口顶部移动130px。同样,按钮将从左侧放置110px,从窗口顶部放置150px。这个例子是实现布局的粗略方式,通常不用于生产; 它仅用于学习目的。Qt支持不同的布局,您将在本教程的后续章节中详细了解。 1btn.clicked.connect(dialog) 最后,这是Qt中信号和插槽的示例。在基于GUI的应用程序中,函数基于用户执行的操作来执行,例如将鼠标悬停在元素上或单击按钮。这些操作称为事件。回想一下,app.exec_()方法将控制转移到Qt 事件循环。这就是事件循环的用途:监听事件并执行响应操作。每当事件发生时,如用户点击按钮,相应的Qtwidgets就会发出信号。这些信号可以连接到python函数(如本例中的对话框函数),以便在触发信号时执行该函数。这些函数在Qt lingo 中称为槽。随后,响应于来自事件的信号触发时隙功能的基本语法如下 1 widget.signal.connect(slot) 这意味着每当窗口触发信号时,将执行连接的槽功能。总之,Qt使用信号和槽来在对象之间进行通信,并促进组件的可重用性和交互性。既然您已经知道如何嵌套窗口并使用信号和插槽实现交互,那么这里有一个有用的窗口列表以及您可以在PyQt应用程序中使用的其他类。 组件和widgetds PyQt中有大量可用于创建GUI应用程序的widgets。但是,使用PyQt5,已经将类重组为不同的模块和许可证的修订版。因此,对PyQt5的结构进行高级视图至关重要。在本节中,您将了解PyQt5如何在内部组织,并了解PyQt5提供的不同模块,库和API类。 PyQt5目录结构这些是Python的Qt绑定使用的基本模块,特别是PyQt5。
PyQt5 Widgets以下是PyQt5中最常用的widgets列表
1check = QCheckBox("button title")
布局和主题在前面的示例中,您只使用move()和resize()方法来设置GUI中widgets的位置。但是,PyQt具有强大的布局管理引擎,可用于为应用程序创建高级用户界面。在本节中,您将了解Qt中用于创建和管理布局的两个重要类。
QBoxLayoutQBoxLayout用于在水平或垂直行中对齐布局的子窗口。从QBoxLayout继承的两类兴趣是:
例如,这是与QHBoxLayout对齐的三个按钮的外观。 ![]() 1import sys 这就是他们在QVBoxLayout中的样子。 ![]() 1import sys 此时唯一需要解释的函数是addWidget()方法。它用于将widget插入HBox或VBox布局。它也可用于其他布局,其中需要不同数量的参数,您将在下一节中看到。窗口将按插入顺序显示在布局中。 QGridLayoutQGridLayout用于创建接口,其中窗口以网格的形式布局(如矩阵或2D数组)。要在网格布局中插入元素,可以使用矩阵表示来定义网格中的行数和列数以及这些元素的位置。例如,要创建3 * 3网格(即具有三行和三列的网格),您将编写以下代码: 1Import sys 输出:![]() addWidget()方法在网格布局中采用以下参数:
要更好地理解它,您可以手动插入每个widget,如下所示 1import sys 如下图: ![]() 您还可以将rowspan和colspan参数传递给addWidget(),以便跨越多个行或列。例如, 1 grid.addWidget(QPushButton("Button five"),2,0,1,0) 这将创建一个拉伸两列的按钮。 ![]() 主题 PyQt5附带了一些你可以在你的应用程序中使用的内置主题。在QApplication实例上调用的setStyle()方法用于为应用程序设置特定主题。 例如,添加以下代码行会将应用程序的主题从默认更改为Fusion 1app.setStyle("Fusion") 这就是前面的例子在Fusion Theme中的样子。 ![]() 另一个用于主题应用程序的有用功能是setPalette()方法。这是使用setPalette()更改不同widget颜色的代码。 1import sys 结果: ![]() 要使用setPalette()方法,首先需要定义一个调色板。这是通过创建QPalette类的对象来完成的。 1 qp = QPalette() 请注意,QPalette类属于QtGui模块,您需要导入它才能使其正常工作。创建QPalette对象后,使用setColor()方法传递要更改颜色的小部件的名称以及要设置的颜色。 1 qp.setColor(QPalette.Window, Qt.black) 这会将窗口的颜色更改为黑色。定义颜色方案后,使用setPalette()函数将调色板应用于应用程序。 1 app.setPalette(qp) 如果您想为您的应用创建一些基本主题,那就是您需要做的。PyQt还允许您使用样式表来定义窗口的外观。如果您熟悉CSS,则可以使用Qt样式表轻松定义应用程序的高级样式。 总结
![]() 长按二维码 ▲ 订阅公众号 ![]() ---------------------------------------------------------------------------------------------------------------------- 我们尊重原创,也注重分享,文章来源于微信公众号:Python技术前线,建议关注公众号查看原文。如若侵权请联系qter@qter.org。 ---------------------------------------------------------------------------------------------------------------------- |