Python Qt GUI与数据可视化编程
上QQ阅读APP看书,第一时间看更新

3.1 数据输入输出

QLineEdit是常用的输入输出字符串的组件,也可以用于输入输出数值数据,只需进行字符串与数字之间的转换。QSpinBox是专门用于输入输出整数的组件,还可以使用二进制、十六进制显示;QDoubleSpinBox是专门用于输入输出浮点数的组件。

示例Demo3_1演示以上3个组件的使用方法,程序运行时界面如图3-1所示。点击“计算总价”按钮时,会根据两个QLineEdit组件里输入的数量和单价计算总价。在“SpinBox输入和显示”分组框里,改变“数量”或“单价”的值,就会自动计算总价。

图3-1 示例Demo3_1运行时界面

Demo3_1是采用单窗体应用程序模板widgetApp创建的。在UI Designer里可视化设计窗体Widget.ui时,两个GroupBox内部的组件采用网格状布局,窗体总体采用垂直布局。窗体上各组件的命名、布局和属性设置详见示例源文件Widget.ui。

在窗体可视化设计时可以设置各个组件的属性。QSpinBox和QDoubleSpinBox都是QAbstractSpinBox的子类,具有大多数相同的属性,区别只是参数类型不同。QSpinBox和QDoubleSpinBox的主要属性如表3-1所示。

表3-1 QSpinBox和QDoubleSpinBox的主要属性

在UI Designer的属性编辑器里可设置属性,一个属性一般对应于类的两个接口函数,即一个读取函数和一个设置函数。例如,QDoubleSpinBox的decimals属性,读取属性值的函数为decimals(),返回一个int数值;设置属性值的函数为setDecimals(prec),参数prec是int类型。

双击Demo3_1项目目录下的uic.bat文件,就可以对Widget.ui文件进行编译,生成文件ui_Widget.py。文件ui_Widget.py中的类Ui_Widget是定义了窗体上所有组件和布局的类,这里不再显示其代码内容。

文件myWidget.py里的代码是窗体业务逻辑类QmyWidget的实现代码,其完整代码如下:

        import sys
        from PyQt5.QtWidgets import  QApplication, QWidget
        from PyQt5.QtCore import  pyqtSlot


        from ui_Widget import Ui_Widget
        class QmyWidget(QWidget):
            def __init__(self, parent=None):
              super().__init__(parent)    #调用父类构造函数,创建窗体
              self.ui=Ui_Widget()         #创建UI对象
              self.ui.setupUi(self)       #构造UI


        ##  ========由connectSlotsByName() 自动关联的槽函数==========
            def on_btnCalculate_clicked(self):    ##"计算总价"按钮
              num=int(self.ui.editCount.text())
              price=float(self.ui.editPrice.text())
              total=num*price
              self.ui.editTotal.setText("%.2f" %total)


            @pyqtSlot(int)      ##"数量"SpinBox
            def on_spinCount_valueChanged(self, count):
              price=self.ui.spinPrice.value()
              self.ui.spinTotal.setValue(count*price)


            @pyqtSlot(float)    ##"单价" DoubleSpinBox
            def on_spinPrice_valueChanged(self, price):
              count=self.ui.spinCount.value()
              self.ui.spinTotal.setValue(count*price)


        ##  ============窗体测试程序 ================================
        if  __name__ == "__main__":        ##用于当前窗体测试
            app = QApplication(sys.argv)    #创建GUI应用程序
            form=QmyWidget()                 #创建窗体
            form.show()
            sys.exit(app.exec_())

对于具有overload型参数的信号,只为其中的一种参数形式的信号生成槽函数时,如果不是默认参数类型,应该使用@pyqtSlot修饰符声明参数类型。

btnCalculate是窗体上的“计算总价”按钮,它是一个QPushButton组件,有clicked()和clicked(bool)两种参数类型的clicked信号,但是clicked()是默认信号,所以无须使用@pyqtSlot修饰符。

spinCount是窗体上用于输入“数量”的QSpinBox组件,其valueChanged信号有valueChanged(str)和valueChanged(int)两种参数类型。在代码里使用的是valueChanged(int)信号,所以在槽函数前面使用了修饰符@pyqtSlot(int)。

同样,QDoubleSpinBox的valueChanged信号也有两种参数类型,使用其中的valueChanged(float)信号时,使用了修饰符@pyqtSlot(float)。

在对overload型信号编写槽函数时,如果不清楚哪个是默认的信号,最好直接使用@pyqtSlot()修饰符对参数类型进行声明。

在使用QSpinBox和QDoubleSpinBox读取和设置数值时,无须做字符串与数值之间的转换,其显示效果(前缀、后缀、进制、小数位数)设置好之后就自动按照效果进行显示,这对于数值数据的输入输出是非常方便的。