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

Qt5 Python GUI 编程指南

创建一个酒店的预定表单

这个应用程序将显示Calendar Widget,提示用户选择要预定一个房间的日期。此外,还显示一个Spin Box部件以询问用户想要停留的天数。除了这个之外,在酒店预约表单中还要使用一个Combo Box部件以显示房间类型供用户选择。房价是基于用户选择的房间类型的。

准备

在我们创建一个酒店预约表单之前,让我们先来了解一下Combo Box部件的使用。

为了在最小的空间内显示几个选项,Combo Box是最好的选择。这个QComboBox类用于显示一个Combo Box部件。通过一个Combo Box部件不仅仅可以显示文本,还可以显示图形图像。这里是QComboBox类提供的方法:

  • setItemText():这个方法用于改变Combo Box部件中的项。

  • removeItem():这个方法用于从Combo Box部件中删除一个项。

  • clear():这个方法用于清空Combo Box部件中的所有项。

  • currentText():这个方法返回Combo Box部件中当前选中项的文本。

  • setCurrentIndex():这个方法用于设置当前项。

  • count():这个方法返回Combo Box部件中项的数量。

  • setMaxCount():这个方法用于为Combo Box部件设置允许选项数量的最大值。

  • setEditable():如果向这个方法传递一个布尔值True,Combo Box部件就是可编辑的。

  • addItem():这个方法用于向Combo Box部件中追加指定的文本。

  • addItems():这个方法用于向Combo Box部件中依次添加多个此方法提供的字符串。每个字符串都是一个接一个的追加。

  • itemText():这个方法返回Combo Box部件中指定索引位置处的文本。

  • currentIndex():这个方法返回Combo Box部件中当前选项的索引值。如果是一个空的或一个没有选择任何项的组合框,这个方法将返回-1。

Combo Box部件产生的信号如下列所示:

  • currentIndexChanged():如果Combo Box部件的索引改变了就会产生此信号,即当在Combo Box部件中选择了不同于当前文本的选项时,就产生此信号

  • activated():当索引由用户交互改变时产生此信号

  • highlighted():当用户高亮Combo Box部件中的一个选项时就会产生此信号

  • editTextChanged():当一个可编辑的Combo Box部件中的文本变化时产生此信号

下面的应用程序是一个酒店预约表单,它提示用户指定预约的日期,停留的天数和用户想要预定的房间类型。然后,依此计算总的房间。用户可以使用Calendar Widget部件指定它的旅行日期,使用Spin Box部件指定旅行天数,使用Combo Box部件指定房间的类型。Combo Box将会显示4种房间类型:Suite,Super Luxury,Super Deluxe和 Ordinary room。这些房间类型的费率分别为$40、$30、$20和$10。

如何去做...

在这个应用程序中,你将学习使用Calendar Widget,Spin Box和Combo Box。所有这三个部件都使数据输入更容易,并且不容易出错。Calendar Widget部件可以很好的切换所需要的月和日。同理,Spin Box部件使你从可用的选项中选择一个值;用户不能随意输入任何无效的数据,对于Combo Box部件也是如此。这里是一步一步开发这个应用的过程:

  1. 在这个应用程序中,使用了6个Label部件,1个Calendar Widget项,1个Spin Box部件,1个Combo Box部件和一个Push Button部件。

  2. 将前4个Label的text属性分别设置为Hotel Room Reservation,Date of Reservation,Number of days和Room type。

  3. 将第5和第6个Label部件的objectName属性分别设置为Enteredinfo和RoomRentinfo。

  4. 这个Enteredinfo部件将用于显示用户在不同部件中选择的选项,并且这个RoomRentinfo部件将用于显示计算后的房价。

  5. 删除剩下2个Label的text属性,Enteredinfo和RoomRentinfo会让它们在窗体中不可见;将通过程序分别设置它们的文本。

  6. 将Push Button部件的text属性设置为Calculate Room Rent,增加表示Hotel Room Reservation文本的Label部件的点数值,并设置它的Bold属性来使它显示为应用的标题

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

    使用pyuic5命令将.ui的XML文件转换成Python代码。生成的Python代码reservehotel.py可以在本书源码中找到。

  8. 创建一个名为computeRoomRent.pyw的Python脚本并导入上面的代码reservehotel.py,以调用用户界面设计,并根据所选的房间类型与停留天数计算并显示房间的总价。这个脚本也会显示用户选择的日期,人的数量和房间类型选项。

    这个Python脚本computeRoomRent.pyw代码如下所示:

import sys
from PyQt5.QtWidgets import QDialog, QApplication
from reservehotel import *
class MyForm(QDialog):
    def __init__(self):
        super().__init__()
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        self.roomtypes=['Suite', 'Super Luxury', 'Super Deluxe',
        'Ordinary']
        self.addcontent()
        self.ui.pushButton.clicked.connect(self.computeRoomRent)
        self.show()
    def addcontent(self):
        for i in self.roomtypes:
            self.ui.comboBox.addItem(i)
    def computeRoomRent(self):
        dateselected=self.ui.calendarWidget.selectedDate()
        dateinstring=str(dateselected.toPyDate())
        noOfDays=self.ui.spinBox.value()
        chosenRoomType=self.ui.comboBox.itemText(self.ui.comboBox.
        currentIndex())
        self.ui.Enteredinfo.setText('Date of reservation:
        '+dateinstring+ ', Number of days: '+ str(noOfDays) + '
        nand Room type selected: '+ chosenRoomType)
        roomRent=0
        if chosenRoomType=="Suite":
        	roomRent=40
        if chosenRoomType=="Super Luxury":
        	roomRent=30
        if chosenRoomType=="Super Deluxe":
       		roomRent=20
        if chosenRoomType=="Ordinary":
            roomRent=10
            total=roomRent*noOfDays
            self.ui.RoomRentinfo.setText('Room Rent for single
            day for '+ chosenRoomType +' type is '+
            str(roomRent)+ '$. nTotal room rent is '+
            str(total)+ ')
if __name__=="__main__":
    app = QApplication(sys.argv)
    w = MyForm()
    w.show()
    sys.exit(app.exec_())

它是如何工作的...

在本代码中,你可以看到roomtypes列表定义了4个元素:Suite,Super Luxury,Super Deluxe和Ordinary。为了让这些 roomtypes 列表元素作为 Combo Box 部件中的项显示,就要调用 addcontent 方法,它调用 addItem() 方法将 roomtypes 中的元素添加到 Combo Box 部件中。此外,Push Button 部件的 clicked() 信号与computeRoomRent() 方法相关联,当用户在选择了预约日期,停留的天数和房间类型之后单击按钮时调用此方法。在computeRoomRent()方法中,你从Calendar Widget中获取日期,从Spin Box部件中得到停留天数并从Combo Box部件中得到房间类型,然后通过Enteredinfo部件显示它们,以指示用户选择的选项。然后,单个房价是由选择的房间类型决定的并乘以停留的天数就得到总房价,总房价通过roomRent显示,如下截图所示:

它是如何工作的...

在本代码中,你可以看到roomtypes列表定义了4个元素:Suite,Super Luxury,Super Deluxe和Ordinary。为了让这些 roomtypes 列表元素作为 Combo Box 部件中的项显示,就要调用 addcontent 方法,它调用 addItem() 方法将 roomtypes 中的元素添加到 Combo Box 部件中。此外,Push Button 部件的 clicked() 信号与computeRoomRent() 方法相关联,当用户在选择了预约日期,停留的天数和房间类型之后单击按钮时调用此方法。在computeRoomRent()方法中,你从Calendar Widget中获取日期,从Spin Box部件中得到停留天数并从Combo Box部件中得到房间类型,然后通过Enteredinfo部件显示它们,以指示用户选择的选项。然后,单个房价是由选择的房间类型决定的并乘以停留的天数就得到总房价,总房价通过roomRent显示,如下截图所示:

​​​​​​​