PyQt是开源小部件工具箱Qt的python绑定,它还可以用作跨平台的应用程序开发框架。 Qt是一种流行的C ++框架,用于为所有主要的桌面,移动和嵌入式平台(支持Linux,Windows,MacOS,Android,iOS,Raspberry Pi等)编写GUI应用程序。
PyQt是由位于英国的Riverbank Computing开发和维护的免费软件,而Qt是由一家名为The Qt Company的芬兰公司开发的。
以下是PyQt的重要特征:
PyQt由600多个类组成,涵盖了一系列特征,例如
可以组合使用这些特征来创建高级UI和独立应用程序。 所有行业的许多主要公司都在使用Qt。 LG,梅赛德斯,AMD,松下,哈曼等都是示例。
PyQt有两个版本,PyQt4和PyQt5。 PyQt4提供了绑定Qt框架的4.x和5.x版本的粘合代码,而PyQt5仅提供了5.x版本的绑定。 结果,PyQt5与旧版本已弃用的模块不向后兼容。 在本教程中,将使用PyQt5进行示例演示。 除了这两个版本
Riverbank Computing还提供了PyQt3D-Qt3D框架的python绑定。 Qt3D是用于创建具有2D / 3D渲染的实时仿真系统的应用程序框架。
有两种安装PyQt的方法。
Qt(发音为cute)是一个复杂的系统,PyQt代码库在内部包含编译的C ++和Python代码。结果,与其他python库相比,从源代码构建和安装它是一个复杂的过程。但是,您可以使用轮子轻松安装PyQt5。
带轮安装
Wheels是新的标准Python包装和分发格式。简而言之,车轮是具有特殊名称和扩展名.whl的ZIP存档。可以使用pip(Python的软件包管理器)安装Wheels,pip在最新版本的Python中默认包含在其中。
因此,如果您安装了Python 3.4或更高版本,则您已经有了pip。但是,如果您使用的是旧版本的Python,则必须先下载并安装pip,然后再继续。您可以在以下链接中搜索相关说明:https://pypi.org/project/pip/。
要安装PyQt5,
步骤1)在Windows计算机中打开命令提示符或PowerShell。
步骤2)输入以下内容
pip install PyQt5
此步骤将下载PyQt5 whl软件包(约50 MB)并将其安装在您的系统上。
步骤1)另外,您也可以下载Windows二进制文件,以获取计算机上安装的python版本。
完成后,继续进行下一部分以编写您的第一个GUI应用程序。
既然您已经在计算机中成功安装了PyQt5,则可以使用python编写GUI应用程序了。
让我们从一个简单的应用程序开始,它将在屏幕上显示一个空窗口。
启动您的python IDLE并输入以下内容:
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的新窗口,如下所示。
很好!工作正常 数量不多,但足以掌握基本知识。 现在,让我们详细了解程序中的每一行。
from PyQt5.QtWidgets import QApplication, QWidget
该语句将创建GUI所需的所有模块导入到当前名称空间中。 QtWidgets模块包含您将在本教程中使用的所有主要小部件。
app = QApplication(sys.argv)
在这里,您正在创建QApplication类的对象。 这是PyQt5的必要步骤; 每个UI应用程序都必须创建QApplication的实例,作为该应用程序的一种入口点。 如果不创建它,将显示错误。
sys.argv是通过外壳启动或自动化接口时可以传递给应用程序的命令行参数列表。
在此示例中,您没有将任何参数传递给QApplications。 因此,您也可以将其替换为下面的代码,甚至不必导入sys模块。
app = QApplication([])
w = QWidget()
接下来,我们创建QWidget类的对象。 QWidget是Qt中所有UI对象的基类,实际上您在应用程序中看到的所有内容都是一个小部件。 其中包括对话框,文本,按钮,栏等。 允许您设计复杂的用户界面的函数是可以嵌套这些小部件,即您可以在一个小部件内有一个小部件,而该小部件又在另一个小部件内。 您将在下一部分中看到这一点。
w.resize(300,300)
QWidget类的resize方法允许您设置任何小部件的尺寸。 在这种情况下,您已将窗口的大小调整为300px x 300px。
在这里,您应该记住,小部件可以嵌套在一起,最外面的小部件(即没有父级的小部件)称为窗口。
w.setWindowTitle('Guru99')
setWindowTitle()方法允许您将字符串作为参数传递,这会将窗口的标题设置为所传递的字符串。 在示例中,标题栏将显示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中的关键字,并且下划线解决了命名冲突。
超越空窗(Beyond empty windows)
在上一节中,您了解了如何在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本身提供了默认标题。
现在它可以正常工作了,让我们看一下您添加到上一个示例中的额外代码。
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QMessageBox
这将导入您在此示例中使用的其他一些小部件,即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方法。 该按钮上触发的click事件导致该函数执行。 这种函数在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支持不同的布局,您将在本教程的后续部分中详细了解。
btn.clicked.connect(dialog)
最后,这是Qt中信号和时隙的示例。 在基于GUI的应用程序中,函数是基于用户执行的操作执行的,例如,将鼠标悬停在元素上或单击按钮。 这些动作称为事件。 回想一下app.exec_()方法将控制权转移到Qt事件循环。 这就是事件循环的用途:侦听事件并执行响应操作。
每当发生事件时,例如用户单击按钮,相应的Qt小部件都会发出信号。 这些信号可以连接到python函数(例如本示例中的dialog函数),以便在触发信号时执行该函数。 这些函数在Qt术语中称为slots 插槽。
随后,响应事件信号触发插槽函数的基本语法如下
widget.signal.connect(slot)
这意味着只要小部件触发了信号,就会执行连接的插槽函数。 总之,Qt使用信号和插槽在对象之间进行通信,并促进组件的可重用性和交互性。
既然您知道如何嵌套小部件并使用信号和插槽实现交互,下面列出了可以在PyQt应用程序中使用的有用小部件和其他类。
PyQt中提供了大量用于创建GUI应用程序的小部件。 但是,使用PyQt5,将类重新转换为许可证中的不同模块和修订版。
因此,对PyQt5的结构有一个高层次的了解至关重要。 在本节中,您将了解PyQt5的内部组织方式,并了解PyQt5提供的不同模块,库和API类。
PyQt5目录结构
这些是Python Qt绑定使用的基本模块,特别是PyQt5。
这是PyQt5中最常用的小部件的列表
QLineEdit:这是一个输入字段,允许用户输入一行文本。
line = QLineEdit()
QRadioButton:这是带有可选按钮的输入字段,类似于html中的单选按钮。
rad = QRadioButton("button title")
rad.setChecked(True) #to select the button by default.
QComboBox:用于显示带有可选项目列表的下拉菜单。
drop = QComboBox(w)
drop.addItems(["item one", "item two", "item three"])
QCheckBox:类似于标签单选按钮,在标签前面显示一个可选的方框,如果选中该方框,将其选中。
check = QCheckBox("button title")
QMenuBar:在窗口顶部显示水平菜单栏。 您只能将QMenu类的对象添加到此栏中。 这些QMenu对象可以进一步包含字符串,QAction对象或其他QMenu对象。
QToolBar:它是一个水平栏或窗格,可以在窗口内移动。 它可能包含按钮和其他小部件。
QTab:用于将窗口的内容分为多个页面,可以通过小部件顶部的不同选项卡进行访问。 它由两部分组成:标签栏和标签页。
QScrollBar:用于创建滚动条,允许用户在窗口中向上和向下滚动。 它由一个可移动的滑块,一个滑块轨道以及两个用于向上或向下滚动滑块的按钮组成。
scroll = QScrollBar()
QSplitter:分隔符用于分隔窗口的内容,以便将小部件正确地分组并且不会显得混乱。 QSplitter是PyQt5中可用的主要布局处理程序之一,用于水平和垂直拆分内容。
QDock:停靠小部件是具有两个属性的子窗口:
可以在主窗口中移动它,
可以将其停靠在父窗口之外,并将其停靠在屏幕上的其他位置。
在前面的示例中,您仅使用过move()和resize()方法来设置小部件在GUI中的位置。
但是,PyQt具有强大的布局管理引擎,可用于为应用程序创建高级用户界面。 在本节中,您将了解Qt中用于创建和管理布局的两个重要类。
QBoxLayout
QBoxLayout用于在水平或垂直行中对齐布局的子窗口小部件。 从QBoxLayout继承的两个感兴趣的类是:
QHBoxLayout:用于水平排列子小部件。
QVBoxLayout:用于垂直排列子小部件。
例如,这就是与QHBoxLayout对齐的三个按钮的外观。
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_())
这就是它们在QVBoxLayout中的外观。
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
QGridLayout用于创建接口,在这些接口中,小部件以网格形式(如矩阵或2D数组)进行布局。 要在网格布局中插入元素,可以使用矩阵表示法定义网格中的行数和列数以及这些元素的位置。
例如,要创建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()方法采用以下参数:
为了更好地理解它,您可以手动插入每个小部件,如下所示
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实例上调用的setStyle()方法用于为您的应用程序设置特定的主题。
例如,添加以下代码行会将您的应用程序的主题从默认更改为Fusion
app.setStyle("Fusion")
这就是上一个示例在Fusion Theme中的外观
设置应用主题的另一个有用函数是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的python绑定。
PyQt4和PyQt5是Riverbank Computing开发的两个主要版本。
PyQt框架的主要模块是:QtQtCoreQtWidgetsQtGuiQtSqlQtNetwork
PyQt支持各种小部件,例如:ButtonsText labelsText fieldsRadio buttons and CheckboxesToolbars and Menu barsWebkitTabsDocks
在PyQt中,使用信号和时隙实现交互性。
事件是用户在GUI中执行的操作(例如单击按钮)。
当事件发生时,相应的窗口小部件会发出信号。
插槽是连接到信号并在信号升高时执行的函数。
PyQt具有强大的布局引擎,并支持高级布局设计和管理。 这是PyQt中两个常用的布局方案:Box LayoutGrid Layout
PyQt允许您为GUI应用程序创建自定义主题,并内置了对样式表的支持。
PyQt可用于创建用户界面以及独立应用程序。