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

Qt5 Python GUI 编程指南

使用 Spin Box 部件

Spin Box部件主要是用来显示整型、浮点型和文本数据 。它对用户有一定的约束:用户不可以随意输入任何随机数据,只能从Spin Box提供的可用选项中选择。一个Spin Box部件黙认会显示一个初始值,而且这个值可以通过选择上下按钮或键盘上的上下箭头来增加或减小该值。你可以通过单击Spin Box上的按钮或手动输入的方式让其显示对应的值。

准备

可以使用QSpinBox和QDoubleSpinBox这两个类来创建一个Spin Box,QSpinBox类仅显示整型数值,而QDoubleSpinBox类可以显示浮点数值。QSpinBox类中提供的方法如下所示:

  • value():这个方法返回spin box中选择的当前值。

  • text():这个方法返回spin box中显示的文本。

  • setPrefix():这个方法会在spin box的返回值前面添加一个前缀。

  • setSuffix():这个方法会在spin box的返回值后面添加一个后缀。

  • cleanText():这个方法返回spin box中的值,这个值不带前缀,后缀和首尾空格。

  • setValue():这个方当会为spin box赋值。

  • setSingleStep():这个方法用来设置spin box的步长。步长就是在选择spin box上的上下按钮时一次性增加或减少的数值。

  • setMinimum():这个方法用来设置spin box能够增加到的最大值。

  • setMaximum():这个方法用来设置spin box能够减小到的最小值。

  • setWrapping():这个方法可以传递一个布尔值true来启用spin box的益出策略,wrapping意味着,当spin box的值达到最大值时,再单击向上按钮时,spin box的当前值会显示其第一个值(即最小值)。

QSpinBox中与信号发送有关的方法如下所示:

  • valueChanged():当通过选择上下按钮或使用setValue()方法改变spin box的值时,这时就会发出这个信号。

  • editingFinished():当spin box失去焦点时,就会发出这个信号。

spin box中用于处理浮点数值的类是QDoubleSpinBox。QDoubleSpinBox也支持上面所述的所有方法。黙认情况最多显示两位小数的值。要更改精度,请使用round()方法,它将显示指定小数位的值;该值将四舍五入到指定小数位的值。

一个spin box的minimum、maximum、singleStep和value属性的黙认值分别是0、99、1和0,而一个双精度浮点型的spin box分别是0.000000、99.990000、1.000000和0.000000。

让我们创建一个应用程序,该应用程序将要求用户输入一本书的价格,然后输入客户所购买图书的数量,并显示图书的总数量。此外,应用程序还会提示您输入1公斤糖的价格,然后输入用户购买的糖的数量。输入糖的数量后,app会显示糖的总量。书的数量和糖的数量将分别通过一个spin box和一个双精度spin box输入。

如何去做...

要了解如何通过spin box(自旋框)接受整型和浮点值,并在进一步的计算中使用,让我们基于Dialog without Buttons模板来创建一个新的应用程序,步骤如下:

  1. 先拖放3个Label,1个Spin Box,一个Double Spin Box和4个Line Edit部件。

  2. 两个Label的text属性分别设为Book Price value和Sugar Price,并将第三个Label部件的objectName属性设置为labelTotalAmout。

  3. 将这四个Line Edit部件的objectName属性分别设置为lineEditBookPrice、lineEditBookAmount、lineEditSugarPrice和lineEditSugarAmout。

  4. 将Spin Box部件的objectName属性设置为spinBoxBookQty,然后将Double Spin Box部件的objectName属性设置为doubleSpinBoxSugarWeight。

  5. 删除第三个Label部件TextLabel的text属性,你将通过程序显示总量数值的文本。

  6. 第三个Label部件在删除text属性后将变为不可见。

  7. 当你想要显示不可更改的值时,可以通过取消选中Property Editor 窗口中enable(启用)属性,以禁用lineEditBookAmount和lineEditSugarAmount这两个Line Edit。

  8. 将应用程序保存为demoSpinner.ui:

    

  1. 使用pyuic5命令工具,将.ui(XML)文件转换成Python代码。生成的Python代码文件为demoSpinner.py,可以在本书源码中看到。

  2. 创建一个名为calldemoSpinner.pyw的Python脚本,并导入demoSpinner.py代码,使你能够调用用户界面设计来通过spin box选择的数值同时显示计算书的总量与糖的总量。calldemoSpinner.pyw文件显示如下所示:

import sys
from PyQt5.QtWidgets import QDialog, QApplication
from demoSpinBox import *
class MyForm(QDialog):
    def __init__(self):
        super().__init__()
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        self.ui.spinBoxBookQty.editingFinished.connect(self.
        result1)
        self.ui.doubleSpinBoxSugarWeight.editingFinished.connect
        (self.result2)
        self.show()
def result1(self):
    if len(self.ui.lineEditBookPrice.text())!=0:
    	bookPrice=int(self.ui.lineEditBookPrice.text())
    else:
        bookPrice=0
        totalBookAmount=self.ui.spinBoxBookQty.value() *
        bookPrice
        self.ui.lineEditBookAmount.setText(str
        (totalBookAmount))
def result2(self):
    if len(self.ui.lineEditSugarPrice.text())!=0:
        sugarPrice=float(self.ui.lineEditSugarPrice.text())
    else:
        sugarPrice=0
        totalSugarAmount=self.ui.
        doubleSpinBoxSugarWeight.value() * sugarPrice
        self.ui.lineEditSugarAmount.setText(str(round
        (totalSugarAmount,2)))
        totalBookAmount=int(self.ui.lineEditBookAmount.
        text())
        totalAmount=totalBookAmount+totalSugarAmount
        self.ui.labelTotalAmount.setText(str(round
        (totalAmount,2)))
        
if __name__=="__main__":
    app = QApplication(sys.argv)
    w = MyForm()
    w.show()
    sys.exit(app.exec_())

它是如何工作的...

在这个代码中,你可以看到这两个spin box的editingFinished信号与result1和result2这两个函数相关联。这意味着,当任何一个Spin Box失去焦点时,都会调用对应的方法。当前用户将鼠标移动到其它部件中或通过按下Tab键时,就会失去焦点。

  • 在result1方法中,从Spin Box部件中获得购买的书的数量的整型值,并将其与在lineEditBookPrice部件中输入的价格相乘来计算书的总成本。然后,书的总成本将通过lineEditBookAmount部件显示出来。

  • 类似的,在result2方法中,从双精度spin box中获取购买的糖的重量的浮点数值,并与lineEditSugarPrice部件中输入的每千克的糖的价格相乘计算糖的总成本,然后通过lineEditSugarAmount部件显示出来。最终,书的总成本和糖的总成本通过labelTotalAmount部件显示,如下截图所示: