Qt5 Python GUI 编程指南
创建时间:2018-12-10  访问量:7797  8  0

Qt5 Python GUI 编程指南

单继承的使用

单继承是继承中最简单的类型,即一个类派生于另外一个单独类,如下图所示:

类B继承了类A,类A被称为超类或基类,而类B被称为派生类或子类。

下面的语句定义了一个单继承,即Marks类继承于Student类:

class Marks(Student):

在前面的语句中,Student是基类,而Marks是派生类。因此 ,Marks类的实例可以访问Student类中的变量和方法。

准备

为了理解单继承的概念,我们运行一个示例来说明,让我们来创建一个应用程序,这个应用将提示用户输入学号、姓名和一个学生的历史与地理的成绩,并在单击一个按钮时显示。

这个由用户输入的学号和姓名会赋给Student类中的类变量。历史和地理的分数将赋给另一个Marks类中的类变量。为了访问学号和姓名与历史和地理的分数,这个Marks类需要继承自Student类。使用继承,Marks类的实例就可以访问并显示Student类中的学号与姓名。

如何去做...

运行Qt Designer并基于Dialog without Buttons模板新建一个应用程序,执行以下步骤:

  1. 在应用中,拖动5个Label部件,4个Line Edit部件和1个Push Button部件放到窗体上。

  2. 将这4个Label部件的text属性分别设置为Student Code,Student Name,History Marks和Geography Marks。

  3. 删除第5个Label部件的text属性,因为它的text属性将通过代码设置以显示学号、姓名、历史与地理的分数。

  4. 将Push Button部件的text属性设置为Click。

  5. 将4个Line Edit部件的objectName属性分别设置为lineEditCode,lineEditName,lineEditHistoryMarks和lineEditGeographyMarks。

  6. 将Label部件的objectName设置为labelResponse,并将Push Button部件的objectName属性设置为ButtonClickMe。

  7. 将应用程序保存为demoSimpleInheritance.ui。这个应用程序的显示如下截图所示:

    用户界面文件demoSimpleInheritance.ui是一个XML文件,要使用pyuic5命令将其转换成Python代码。你可以在本书的源码中找到这个已生成的Python脚本文件demoSimpleInheritance.py。前面的代码将作为头文件,并导入到其它想要调用用户界面计设的Python脚本中。

  8. 创建另一个名为callSimpleInheritance.pyw的Python文件并导入demoSimpleInheritance.py代码。这个callSimpleInheritance.pyw的Python脚本代码如下所示:

import sys
from PyQt5.QtWidgets import QDialog, QApplication
from demoSimpleInheritance import *
class Student:
    name = ""
    code = ""
    def __init__(self, code, name):
        self.code = code
        self.name = name
    def getCode(self):
    	return self.code
    def getName(self):
    	return self.name
class Marks(Student):
    historyMarks = 0
    geographyMarks = 0
    def __init__(self, code, name, historyMarks,
        geographyMarks):
        Student.__init__(self,code,name)
        self.historyMarks = historyMarks
        self.geographyMarks = geographyMarks
    def getHistoryMarks(self):
    	return self.historyMarks
    def getGeographyMarks(self):
    	return self.geographyMarks
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):
        marksObj=Marks(self.ui.lineEditCode.text(),
        self.ui.lineEditName.text(),
                       self.ui.lineEditHistoryMarks.text(),
        self.ui.lineEditGeographyMarks.text())
        self.ui.labelResponse.setText("Code:
        "+marksObj.getCode()+", Name:"+marksObj.getName()+"
        nHistory Marks:"+marksObj.getHistoryMarks()+", Geography
        Marks:"+marksObj.getGeographyMarks())
if __name__=="__main__":
    app = QApplication(sys.argv)
    w = MyForm()
    w.show()
    sys.exit(app.exec_())

它是如何工作的...

在这个代码中,你看到定义了一个Student的类。这个Student类包含了2个名为name和code的类变量,类中的三个方法如下所示:

  • __init()__:它是一个带有一个必需的self参数和两个参数code和name的构造函数,这两个参数用于初始化类中的两个类变量code与name

  • getCode():这个方法简单的返回code类变量的值

  • getName():这个方法简单的返回name类变量的值

这个Marks类继承自Student类。因此,一个Marks类的实例不仅仅能够访问它自己的成员,还可以访问Student类中的成员。

这个Marks类中包含两个类变量,它们分别是historyMarks和geographyMarks,包含下面三个方法:

  • __init()__:这是一个构造函数,它带有一个必需的self参数和另外四个参数,分别是code、name、historyMarks和geographyMarks。在这个构造函数中调用了Student类中的构造函数并传入code和name参数。这个historyMarks和geographyMarks参数将被用于初始化类成员historyMarks和geographyMarks。

  • getHistoryMarks():这个方法简单的返回historyMarks类变量的值。

  • getGeographyMark():这个方法简单的返回geographyMarks类变量的值。

Push Button的clicked()事件与dispmessage()方法相关联。在Line Edit部件中输入了学号、姓名和历史与地理分数之后,当用户单击按钮时,就会调用dispmessage()方法。这个dispmessage()方法定义了名为marksObj的Marks类的对象,并且传入了用户在Line Edit中输入的学号、姓名和历史与地理分数。调用Marks类中的构造函数 __init()__,并传入用户输入的这些参数。在Marks类的构造函数中,将调用Student类中的构造函数,并将code和name参数传给此构造函数。这个code和name参数将被分别赋给Student类中的code与name类变量。类似的,历史与地理分数将会被分别赋给Marks类中的historyMarks和geographyMarks类变量。在这之后,Label部件labelResponse会通过调用marksObj对象中的四个方法getCode,getName,getHistoryMarks和getGeographyMarks来设置并显示学号、姓名和历史与地理的分数。Marks类的marksObj对象具有访问Student类中的getCode和getName的权限,因为它使用了继承。因此,在单击按钮时,Label部件就会显示用户输入的学号、姓名、历史分数和地理分数,它是通过一个叫labelResponse的Label部件显示的,如下截图所示:

​​​​​​​