PyQt对话框,控件(实例:利息计算程序)
作业描述
实现如下图所示的利息计算程序
复利
全解python代码实现
import sys
import PyQt5.QtCore as qc
import PyQt5.QtGui as qg
import PyQt5.QtWidgets as qw
#新建一个对话框,继承自QDialog
class Form(qw.QDialog):
#重载构造函数
def __init__(self,parent = None):
#重载父类构造函数
super().__init__(parent)
#改变窗口显示的title
self.setWindowTitle("Interest")
#第一行标签Principal
self.prinLabel = qw.QLabel("&Principal:")
#第一行Principal的数字框
self.prinSpinBox = qw.QDoubleSpinBox(self)
#前缀
self.prinSpinBox.setPrefix("$")
#范围
self.prinSpinBox.setRange(0.01,1000000)
#初始值
self.prinSpinBox.setValue(1000.00)
#给prinLabel配个合作伙伴prinSpinBox
self.prinLabel.setBuddy(self.prinSpinBox)
#第二行标签Rate
self.rateLabel = qw.QLabel("&Rate:")
#第二行Rate的数字框
self.rateSpinBox = qw.QDoubleSpinBox(self)
#后缀
self.rateSpinBox.setSuffix("%")
#初始值
self.rateSpinBox.setValue(5.00)
#给rateLabel配个合作伙伴rateLabel
self.rateLabel.setBuddy(self.rateLabel)
#第三行标签year
self.yearLabel = qw.QLabel("&Year")
#第三行下拉框year
self.yearComboBox = qw.QComboBox(self)
self.itemdata = ['1 Year','2 Years','3 Years','4 Years','5 Years']
self.yearComboBox.addItems(self.itemdata)
#第四行标签结果
self.amountLabel = qw.QLabel("&Amount")
# ***
self.resultLabel = qw.QLabel("$ 1102.50")
#显示,网格布局
self.layout = qw.QGridLayout(self)
self.layout.addWidget(self.prinLabel, 0, 0)
self.layout.addWidget(self.prinSpinBox, 0, 1)
self.layout.addWidget(self.rateLabel, 1, 0)
self.layout.addWidget(self.rateSpinBox, 1, 1)
self.layout.addWidget(self.yearLabel, 2, 0)
self.layout.addWidget(self.yearComboBox, 2, 1)
self.layout.addWidget(self.amountLabel, 3, 0)
self.layout.addWidget(self.resultLabel, 3, 1)
self.setLayout(self.layout)
#链接信号与槽
self.prinSpinBox.valueChanged.connect(self.updateData)
self.rateSpinBox.valueChanged.connect(self.updateData)
self.yearComboBox.currentIndexChanged.connect(self.updateData)
def updateData(self):
#获取prinSpinBox中更新的数据
prin = float(self.prinSpinBox.value())
#获取rateSpinBox中更新的数据
rate = float(self.rateSpinBox.value())
#获取yearComboBox中更新的数据
year = int(self.yearComboBox.currentIndex())+1
#计算结果
result = prin * pow((1+0.01*rate),(year+1))
#把更新结果显示在resultLabel中
self.resultLabel.setText("{0:.2f}".format(result))
app = qw.QApplication(sys.argv)
form = Form()
form.show()
app.exec_()
全解代码截图
部分代码过程详解
1.新建对话框
2.放入控件QLabel()
3.网格布局QGridLayout()
这之后虽然label控件已经存在了,但是未显示。
所以:
定义layout对象,使用网格布局(也有垂直布局等等)
再在layout对象里显示self.prinLabel
用addWidget()
(0,0)表示显示在(0,0)位置上
效果:
4.放入数字框控件QDoubleSpinBox()
同理:
效果:
再改变数据框的各种参数,用setXxxx()
还可以把Label和SpinBox组队:
效果:
5.放入控件QComboBox(下拉框)
同理完成其他代码
可用QComboBox()定义下拉框,用addItems()修改下拉选项
界面完成的整体效果
6.链接信号和槽
格式:发出对象.信号名.connect(接收对象.槽名)
这里用xxxx.valueChanged.connect(xx)或者xxxx.currentIndexChanged.connect(xx)等等链接信号和槽
7.定义槽
定义updateData,处理接收到的更新数据并作出反应
!!!!Interesting!!!!