找回密码
 立即注册
Qt开源社区 门户 查看内容

PyQt:Python GUI Designer

2019-9-5 16:52| 发布者: admin| 查看: 2560| 评论: 0

摘要: 什么是PyQt?PyQt是开源widget-toolkit Qt的python绑定,它也可以作为跨平台的应用程序开发框架。Qt是一个流行的C ++框架,用于为所有主要的桌面,移动和嵌入式平台编写GUI应用程序(支持Linux,Windows,MacOS,And ...
什么是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版本

  • 如何安装PyQt

  • 基本的PyQt概念和程序

  • 组件和小部件

  • 主题

PyQT的特点

这里是PyQt的重要功能:

PyQt包含六百多个类,涵盖了一系列功能,如:

  • 图形用户界面

  • SQL数据库

  • Web工具包

  • XML处理

  • 网络

可以组合这些功能来创建高级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有两种方法。

  • 使用Wheel文件

  • 从源代码构建和安装

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
2from PyQt5.QtWidgets import QApplication, QWidget
3if __name__ == "__main__":
4    app = QApplication(sys.argv)
5    w = QWidget()
6    w.resize(300,300)
7    w.setWindowTitle(‘Guru99’)
8    w.show()
9    sys.exit(app.exec_())

将其保存为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
2from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QMessageBox
3
4def dialog():
5    mbox = QMessageBox()
6
7    mbox.setText("Your allegiance has been noted")
8    mbox.setDetailedText("You are now a disciple and subject of the all-knowing Guru")
9    mbox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
10
11    mbox.exec_()
12
13if __name__ == "__main__":
14    app = QApplication(sys.argv)
15    w = QWidget()
16    w.resize(300,300)
17    w.setWindowTitle('Guru99')
18
19    label = QLabel(w)
20    label.setText("Behold the Guru, Guru99")
21    label.move(100,130)
22    label.show()
23
24    btn = QPushButton(w)
25    btn.setText('Beheld')
26    btn.move(110,150)
27    btn.show()
28    btn.clicked.connect(dialog)
29
30
31    w.show()
32    sys.exit(app.exec_())

将文件另存为appone.py或任何您喜欢的文件,然后按F5运行该程序。如果您没有犯任何错误,IDLE将打开一个带有一些文本和按钮的新窗口,如下所示。


  1. 单击第一个窗口中的按钮后,将弹出一个新消息框,其中包含您编写的文本。
  2. 您现在可以单击隐藏详细信息/显示详细信息按钮以切换其他文本的可见性。
如您所见,由于我们没有在消息框中设置任何窗口标题,因此python本身提供了一个默认标题。现在它正在运行,让我们来看看在前一个例子中添加的额外代码。1from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QMessageBox

这会导入您在此示例中使用的更多widgets,即QLabel,QPushButton和QMessageBox。
1def dialog():
2    mbox = QMessageBox()
3
4    mbox.setText("Your allegiance has been noted")
5    mbox.setDetailedText("You are now a disciple and subject of the all-knowing Guru")
6    mbox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
7
8    mbox.exec_()

在这里,您已经定义了一个名为dialog的方法,该方法创建一个消息框并将一些文本设置为按钮和其他字段。当在特定widget(在这种情况下,btn PushButton)中按下按钮时,从程序的主块调用对话框方法。在该按钮上触发的单击事件会导致执行此功能。这样的函数在Qt中称为插槽,您将在后续段落中了解有关信号和槽的更多信息。1if __name__ == "__main__":
2    app = QApplication(sys.argv)
3    w = QWidget()
4    w.resize(300,300)
5    w.setWindowTitle('Guru99')

这是应用程序的主要部分,与前面的示例一样,您首先要创建一个QApplication实例,然后是一个简单的widget,即QWidget的一个实例。
1 label = QLabel(w)
2    btn = QPushButton(w)

您已在此应用程序中添加了两个新widgets:QLabel和QPushButton。QLabel用于在窗口中打印不可编辑的文本或占位符,而QPushButton用于创建可单击的按钮。这里需要注意的关键是,当您创建标签和btn对象时,您将窗口对象(w)传递给QLabel和QPushButton的构造函数。这就是嵌套在PyQt5中的工作原理。要在另一个窗口中创建窗口,请将父窗口的引用传递给子窗口的构造函数。1label.move(100,130)
2btn.move(110,150)


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。
  • Qt:它将下面提到的所有类/模块组合到一个模块中。它大大增加了应用程序使用的内存。但是,通过仅导入一个模块来管理框架更容易。
  • QtCore:包含其他模块使用的核心非图形类。这是实现Qt事件循环,信号和槽连接等的地方。
  • QtWidgets:包含Pyqt5中可用的大多数widgets。
  • QtGui:包含GUI组件并扩展QtCore模块。
  • QtNetwork:包含用于通过Qt实现网络编程的类。它支持TCP服务器,TCP套接字,UDP套接字,SSL处理,网络会话和DNS查找。
  • QtMultimedia:提供低级多媒体功能。
  • QtSql:实现SQL数据库的数据库集成。支持ODBC,MySQL,Oracle,SQLite和PostgreSQL。

PyQt5 Widgets

以下是PyQt5中最常用的widgets列表
  • QLineEdit:这是一个输入字段,允许用户输入一行文本
    1line = QLineEdit()
  • QRadioButton:这是一个带有可选按钮的输入字段,类似于html中的单选按钮。
    1rad = QRadioButton("button title")
    2rad.setChecked(True)  #to select the button by default.
  • QComboBox:用于显示带有可选项列表的下拉菜单。
  • 1drop = QComboBox(w)
    2drop.addItems(["item one", "item two", "item three"])

  • QCheckBox:在标签前面显示一个可选的方框,如果选中,则选中该方框,类似于单选按钮。

    1check = QCheckBox("button title")

  • QMenuBar:它在窗口顶部显示一个水平菜单栏。您只能将QMenu类的对象添加到此栏。那些QMenu对象还可以包含字符串,QAction对象或其他QMenu对象。
  • QToolBar:它是一个可以在窗口内移动的水平条或窗格。它可能包含按钮和其他小部件。
  • QTab:它用于将窗口内容分解为多个页面,可以通过窗口顶部的不同选项卡进行访问。它由两部分组成:标签栏和标签页。
  • QScrollBar:用于创建滚动条,允许用户在窗口中向上和向下滚动。它由一个可移动的滑块,一个滑块轨道和两个按钮组成,用于向上或向下滚动滑块。
  • 1scroll = QScrollBar()
  • QSplitter:分割器用于分隔窗口的内容,以便widgets正确分组并且看起来不会混乱。QSplitter是PyQt5中可用的主要布局处理程序之一,用于水平和垂直分割内容。
  • QDock:dock widgets是一个具有两个属性的子窗口:
    • 它可以在主窗口内移动
    • 它可以停靠在父窗口之外的屏幕上的另一个位置。

布局和主题

在前面的示例中,您只使用move()和resize()方法来设置GUI中widgets的位置。但是,PyQt具有强大的布局管理引擎,可用于为应用程序创建高级用户界面。在本节中,您将了解Qt中用于创建和管理布局的两个重要类。
  1. QBoxLayout
  2. QGridLayout

QBoxLayout

QBoxLayout用于在水平或垂直行中对齐布局的子窗口。从QBoxLayout继承的两类兴趣是:
  • QHBoxLayout:用于水平排列子窗口。
  • QVBoxLayout:用于垂直排列子窗口。

例如,这是与QHBoxLayout对齐的三个按钮的外观。


1import sys
2from PyQt5.QtWidgets import *
3
4if __name__ == "__main__":
5
6    app = QApplication([])
7    w = QWidget()
8    w.setWindowTitle("Musketeers")
9
10    btn1 = QPushButton("Athos")
11    btn2 = QPushButton("Porthos")
12    btn3 = QPushButton("Aramis")
13
14    hbox = QHBoxLayout(w)
15
16    hbox.addWidget(btn1)
17    hbox.addWidget(btn2)
18    hbox.addWidget(btn3)
19
20    w.show()
21
22    sys.exit(app.exec_())

这就是他们在QVBoxLayout中的样子。


1import sys
2from PyQt5.QtWidgets import *
3
4if __name__ == "__main__":
5
6    app = QApplication([])
7    w = QWidget()
8    w.setWindowTitle("Musketeers")
9
10    btn1 = QPushButton("Athos")
11    btn2 = QPushButton("Porthos")
12    btn3 = QPushButton("Aramis")
13
14    vb = QVBoxLayout(w)
15
16    vb.addWidget(btn1)
17    vb.addWidget(btn2)
18    vb.addWidget(btn3)
19
20    w.show()
21
22    sys.exit(app.exec_())

此时唯一需要解释的函数是addWidget()方法。它用于将widget插入HBox或VBox布局。它也可用于其他布局,其中需要不同数量的参数,您将在下一节中看到。窗口将按插入顺序显示在布局中。

QGridLayout

QGridLayout用于创建接口,其中窗口以网格的形式布局(如矩阵或2D数组)。要在网格布局中插入元素,可以使用矩阵表示来定义网格中的行数和列数以及这些元素的位置。例如,要创建3 * 3网格(即具有三行和三列的网格),您将编写以下代码: 1Import sys
2from PyQt5.QtWidgets import *
3
4if __name__ == "__main__":
5    app = QApplication([])
6
7    w = QWidget()
8
9    grid = QGridLayout(w)
10
11    for i in range(3):
12        for j in range(3):
13            grid.addWidget(QPushButton("Button"),i,j)
14
15
16    w.show()
17    sys.exit(app.exec_())
输出:


addWidget()方法在网格布局中采用以下参数:
  • 要添加到网格的窗口小部件对象
  • 对象的x坐标
  • 对象的y坐标
  • 行跨度(默认= 0)
  • col-span(默认值= 0)

要更好地理解它,您可以手动插入每个widget,如下所示 1import sys
2from PyQt5.QtWidgets import *
3
4if __name__ == "__main__":
5    app = QApplication([])
6
7    w = QWidget()
8
9    grid = QGridLayout(w)
10    grid.addWidget(QPushButton("Button one"),0,0)
11    grid.addWidget(QPushButton("Button two"),0,1)
12    grid.addWidget(QPushButton("Button three"),1,0)
13    grid.addWidget(QPushButton("Button four"),1,1)
14
15
16    w.show()
17    sys.exit(app.exec_())

如下图:


您还可以将rowspan和colspan参数传递给addWidget(),以便跨越多个行或列。例如,1 grid.addWidget(QPushButton("Button five"),2,0,1,0)

这将创建一个拉伸两列的按钮。


主题

PyQt5附带了一些你可以在你的应用程序中使用的内置主题。在QApplication实例上调用的setStyle()方法用于为应用程序设置特定主题。
例如,添加以下代码行会将应用程序的主题从默认更改为Fusion1app.setStyle("Fusion")

这就是前面的例子在Fusion Theme中的样子。


另一个用于主题应用程序的有用功能是setPalette()方法。这是使用setPalette()更改不同widget颜色的代码。
1import sys
2from PyQt5.QtCore import Qt
3from PyQt5.QtWidgets import *
4from PyQt5.QtGui import QPalette
5
6if __name__ == "__main__":
7    app = QApplication([])
8    app.setStyle("Fusion")
9
10    qp = QPalette()
11    qp.setColor(QPalette.ButtonText, Qt.black)
12    qp.setColor(QPalette.Window, Qt.black)
13    qp.setColor(QPalette.Button, Qt.gray)
14    app.setPalette(qp)
15
16    w = QWidget()
17
18    grid = QGridLayout(w)
19    grid.addWidget(QPushButton("Button one"),0,0)
20    grid.addWidget(QPushButton("Button two"),0,1)
21    grid.addWidget(QPushButton("Button three"),1,0)
22    grid.addWidget(QPushButton("Button four"),1,1)
23
24
25    w.show()
26    sys.exit(app.exec_())


结果:



要使用setPalette()方法,首先需要定义一个调色板。这是通过创建QPalette类的对象来完成的。
1 qp = QPalette()


请注意,QPalette类属于QtGui模块,您需要导入它才能使其正常工作。创建QPalette对象后,使用setColor()方法传递要更改颜色的小部件的名称以及要设置的颜色。

1 qp.setColor(QPalette.Window, Qt.black)


这会将窗口的颜色更改为黑色。定义颜色方案后,使用setPalette()函数将调色板应用于应用程序。

1 app.setPalette(qp)


如果您想为您的应用创建一些基本主题,那就是您需要做的。PyQt还允许您使用样式表来定义窗口的外观。如果您熟悉CSS,则可以使用Qt样式表轻松定义应用程序的高级样式。

总结

  • PyQt是C ++ UI框架的Qthon绑定,Qt。

  • PyQt4和PyQt5是Riverbank Computing开发的两个主要版本。

  • PyQt框架的主要模块是:

    1. Qt的

    2. QtCore

    3. QtWidgets

    4. QtGui

    5. QtSql

    6. QtNetwork

  • PyQt支持各种widget,如:

    1. 纽扣

    2. 文字标签

    3. 文本字段

    4. 单选按钮和复选框

    5. 工具栏和菜单栏

    6. WebKit的

    7. 标签

    8. 码头

  • 在PyQt中,使用信号和槽实现交互性。

  • 一个事件是通过在GUI用户(如点击按钮)执行的动作。

  • 信号由相应的窗口小部件时的事件在其上发生提高。

  • 槽是连接到所述信号,并且当信号升高执行的函数。

  • PyQt具有强大的布局引擎,支持高级布局设计和管理。这是PyQt中两种常用的布局方案:

    1. 框布局

    2. 网格布局

  • PyQt允许您为GUI应用程序创建自定义主题,并为样式表提供内置支持。

  • PyQt可用于创建用户界面以及独立应用程序。



长按二维码 ▲ 订阅公众号




----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:Python技术前线,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
----------------------------------------------------------------------------------------------------------------------

鲜花

握手

雷人

路过

鸡蛋

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了