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