Qt5 Python GUI 编程指南
创建时间:2018-12-10  访问量:10055  9  1

Qt5 Python GUI 编程指南

显示欢迎信息

在本节中,将提示用户输入他/她的名字,然后单击按钮。 单击该按钮时,将显示欢迎消息“Hello”,后跟用户输入的名称。 对于此示例,我们需要使用三个小部件,Label,Line Edit和Push Button。 让我们一个一个地理解这些小部件。

理解Label部件

Label小部件是QLabel类的一个实例,用于显示消息和图像。因为Label小部件只显示计算结果,不接受任何输入,所以它们只用于在屏幕上提供信息。

方法

QLabel类提供的方法如下:

  • setText():此方法为Label部件设置文本

  • setPixmap():这个方法会为Label部件设置一个位图pixmap (QPixmap类的一个实例)

  • setNum():此方法为Label部件设置一个整型或浮点型值

  • clear():这个方法会清除Label部件中的文本

QLabel的默认文本是TextLabel。也就是说,当你通过拖动一个Label放在窗体中就在窗体中添加了一个QLabel类,它将显示TextLabel。除了使用setText(),还可以通过在属性编辑器窗口中设置所选QLabel对象的文本属性,将文本赋给该对象。

理解Line Edit部件

Line Edit部件通常用于输入单行数据。 “Line Edit”窗口部件是QLineEdit类的实例,您不仅可以输入,还可以编辑数据。 除了输入数据外,您还可以在“Line Edit”窗口部件中撤消,重做,剪切和粘贴数据。

方法

QLineEdit类提供的方法如下:

  • setEchoMode():它设置Line Edit部件的回显(echo)模式。也就是说,它决定如何显示行Line Edit部件中的内容。可供选择的方案如下:

    • Normal:这是默认模式,它显示输入的字符

    • NoEcho:它会关闭Line Edit回显,那就是说,它不会显示任何东西

    • Password:这个选项通常用密码域,不显示文本;而是将用户输入文本以*号的形显示

    • PasswordEchoOnEdit:它在编辑密码字段时显示实际文本,否则将显示文本的星号

  • maxLength():这个方法用来指定可以在Line Edit部件中输入文本的最大长度。

  • setText():这个方法用来为Line Edit部件设置文本。

  • text():这个方法可以访问Line Edit部件中输入的文本。

  • clear():这个方法是清除Line Edit部件中的全部内容。

  • setReadOnly():当布尔值true传递给此方法时,它将使Line Edit部件只读,即不可编辑。用户不能通过行Line Edit部件对显示的内容进行任何更改,只能复制。

  • isReadOnly():如果Line Edit部件处于只读模式,此方法返回布尔值true,否则返回false。

  • setEnabled():默认情况下,Line Edit部件是启用的,也就是说,用户可以对它进行更改。但是,如果将Boolean值false传递给此方法,它将禁用Line Edit部件,以使用户无法编辑其内容,只能通过setText()方法分配文本。

  • setFocus():此方法将光标定位在指定的Line Edit部件上。

理解Push Button部件

要在应用程序中显示按钮,需要创建QPushButton类的实例。在将文本分配给按钮时,可以通过在文本中的任何字符前面加上一个&号来创建快捷键。例如,如果指定给一个按钮的文本是Click Me,字符C将加下划线,表示它是一个快捷键,用户可以按Alt + C选择按钮。如果按钮被激活,它将发出click()信号。除了文本之外,按钮中还可以显示图标。在按钮中显示文本和图标的方法如下:

  • setText():此方法用于将文本分配给按钮

  • setIcon():此方法用于为按钮分配图标

如何去做...

让我们基于Dialog without Buttons模板创建一个新的应用程序。 如前所述,此应用程序将提示用户输入名称,并在输入名称后单击按钮时,应用程序将显示问候消息以及输入的名称。 以下是创建此应用程序的步骤:

  1. 从 Display Widgets类别拖动 Label 窗口小部件并将其放在窗体上。 将其text属性设置为Enter your name。 将Label小部件的objectName属性设置为labelResponse。

  2. 从Display Widgets类别拖动Label小部件并将期放到窗体上。不需要改变这个Label部件的text属性并保持黙认值,TextLabel。这是因为这个Label部件的text属性将通过代码设置,那就是说,它将用来向用户显示hello消息。

  3. 从Input Widgets类别中拖出一个Line Edit并将其放到窗体上。将其objectName属性设置为lineEditName。

  4. 从Buttons类别中拖动一个Push Button并将其放到窗体上。将它的text属性设置为Click。你可以改变Push Button的text属性,有三种方式:通过双击Push Button部件并重写黙认的文本,通过右击Push Button部件并在弹出的上下文菜单中选择Change text...选项,或通过选择Property Editor窗口中的text属性并重写黙认值。

  5. 将Push Button部件的objectName属性设置为ButtonClickMe。

  6. 将这个应用保存为demoLineEdit.ui。现在显示这个窗体,如下截图所示:

使用Qt Designer创建的用户界面存储在一个 .ui 文件中,该文件包含窗体的所有信息:小部件、布局等等。ui文件是一个XML文件,您需要将它转换为Python代码。这样,您就可以在可视化界面和在代码中实现行为之间保持清晰的分离。

  1. 要使用 .ui 文件,首先需要将其转换为Python脚本。用于将.ui文件转换为Python脚本的命令程序是pyuic5。在Windows中,pyuic5实用程序与PyQt绑定。要进行转换,需要打开命令提示符窗口,导航到保存文件的文件夹,并发出以下命令:

C:\Pythonbook\PyQt5>pyuic5 demoLineEdit.ui -o demoLineEdit.py

假设我们将窗体保存在这个位置:C:\Pythonbook\PyQt5> 。前面的命令显示了demoLineEdit.ui文件到一个Python脚本demoLineEdit.py的转换。

通过这种方式生成的Python代码不可以手动修改,因为任何更改都将在下次运行pyuic5命令时被覆盖。

生成的Python脚本文件代码,demoLineEdit.py,可以在本书的源代码包中看到。

  1. 将demoLineEdit.py文件中的代码视为头文件,并将其导入到将调用其用户界面设计的文件中。

头文件是指导入当前文件的那些文件的术语。 导入此类文件的命令通常写在脚本的顶部,因此命名为头文件。

  1. 让我们创建另一个名为 callLineEdit.py 的Python文件。导入demoLineEdit.py,代码如下:

import sys
from PyQt5.QtWidgets import QDialog, QApplication
from demoLineEdit import *
class MyForm(QDialog):
    def __init__(self):
        super().__init__()
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        self.ui.ButtonClickMe.clicked.connect(self.dispmessage)
        self.show()
    def dispmessage(self):
    	self.ui.labelResponse.setText("Hello " + self.ui.lineEditName.text())
if __name__=="__main__":
	app = QApplication(sys.argv)
    w = MyForm()
    w.show()
    sys.exit(app.exec_())

它是如何工作的...

demoLineEdit.py 文件很容易理解。创建一个具有顶层对象名称的类,其中前缀为Ui_。由于我们的应用程序中使用的顶级对象是Dialog,因此创建了Ui_Dialog类并存储了widget的界面元素。该类有两个方法,setupUi() 和retranslateUi()。setupUi() 方法用于设置窗口小部件;它创建在Qt Designer中定义用户界面时使用的小部件。该方法逐个创建小部件,并设置它们的属性。setupUi()方法只接受一个参数,该参数是创建用户界面(子窗口小部件)的顶级窗口小部件。在我们的应用程序中,它是QDialog的一个实例。retranslateUi()方法用于转换界面。

让我们理解callLineEdit.py在语句方面的作用:

  1. 它导入必要的模块。在PyQt5中,QWidget是所有用户界面对像的基类。

  2. 它创建了一个新的MyForm类,继承自基类QDialog。

  3. 它为QDialog提供了黙认的构造函数。默认构造函数没有父类,没有父类的部件称为窗口。

  4. 在PyQt5中,事件是使用信号和槽来处理的。信号是一个事件,槽是在信号出现时执行的方法。例如,当你单击了一个按钮时,就会有一个clicked()事件(也称为信号)发生。connect() 方法将信号与槽相关联。在这种情况下,槽是一个方法:dispmessage()。那就是说,当用户单击按钮时,将会调用dispmessage() 方法。在这里,clicked() 是一个事件,一个事件处理循环是等待一个事件的发生然后分发它并执行一些任务。事件循环继续工作直到调用exit()或主部件被销毁为止。

  5. 它通过QApplication()方法创建了一个名为app的应用程序对像。每个PyQt5应用程序必须创建sys.argv应用对像,它包含了命令行的参数列表,并将它传递给创建应用程序对像的方法。sys.argv参数有助于传递和控制一个脚本的启动属性。

  6. 创建了一个名为w的MyForm类的一个实例。

  7. show() 方法将会在屏幕上显示部件。

  8. dispmessage() 方法用于为按钮执行事件处理。它显示Hello文本,和在Line Edit部件中输入的名称。

  9. sys.exit() 方法保证清除退出,以释放内存资源。

exec() 方法有一个下划线,因为exec是Python中的一个关键字。

执行前面的程序,你得到一个拥有Line Edit和Push Button部件的窗口,如下截图所示。当按钮被选择时,dispmessage() 方法将被执行,显示Hello消息和在Line Edit部件中输入的用户名称: