编写一个计算复利的对话框应用程序。做好的效果如下图
先上代码,然后讲解。
import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
class interest(QDialog):
def __init__(self,parent=None):
super(interest,self).__init__(parent)
PrincipalLabel = QLabel("&Princinpal:")
self.PrincipalDoublespinBox = QDoubleSpinBox()
self.PrincipalDoublespinBox.setRange(0,10000) #set range
self.PrincipalDoublespinBox.setValue(0) #set value
self.PrincipalDoublespinBox.setPrefix("$") #set Prefix
PrincipalLabel.setBuddy(self.PrincipalDoublespinBox)# the first paragraph
RateLabel = QLabel("&Rate:")
self.RateDoublespinBox = QDoubleSpinBox()
self.RateDoublespinBox.setRange(0,100)
self.RateDoublespinBox.setValue(0)
self.RateDoublespinBox.setSuffix('%') #set suffix
RateLabel.setBuddy(self.RateDoublespinBox) #the second paragraph
self.list={"1years":1,"2years":2,"3years":3,"4years":4,"5years":5} #create a dict
item = sorted(self.list.keys())
YearsLabel = QLabel("&Years:")
self.YearsComboBox = QComboBox()
self.YearsComboBox.addItems(item) #get the keys of list,set items of ComboBox
YearsLabel.setBuddy(self.YearsComboBox) #the third paragraph
AmountTextLabel = QLabel("Amount")
self.AmountNumLabel = QLabel("0") #the fourth paragraph
layout = QGridLayout()
layout.addWidget(PrincipalLabel,0,0)
layout.addWidget(self.PrincipalDoublespinBox,0,1)
layout.addWidget(RateLabel,1,0)
layout.addWidget(self.RateDoublespinBox,1,1)
layout.addWidget(YearsLabel,2,0)
layout.addWidget(self.YearsComboBox,2,1)
layout.addWidget(AmountTextLabel,3,0)
layout.addWidget(self.AmountNumLabel,3,1)
self.setLayout(layout) #set the layout the fifth paragraph
self.connect(self.RateDoublespinBox,
SIGNAL("valueChanged(double)"),self.updateUi) #value of DoublespinBox
self.connect(self.PrincipalDoublespinBox,
SIGNAL("valueChanged(double)"),self.updateUi) #value of DoublespinBox,the type must be correct,or else can't connect
self.connect(self.YearsComboBox,
SIGNAL("currentIndexChanged(int)"),self.updateUi) #the index value,is numbers:0,1,2,3,4,and also take care of the signal
self.setWindowTitle("compound interest") #the sixth paragraph
def updateUi(self):
principal = self.PrincipalDoublespinBox.value() #get the value with the function of "value()"
rate = self.RateDoublespinBox.value()
years = unicode(self.YearsComboBox.currentText()) #get the Text of the "text ComboBox" with the function of "currentText()"
amount = principal*((1+(rate/100.0))**self.list[years])
self.AmountNumLabel.setText(unicode(amount)) #setText_function,Qstring argument #the seventh paragraph
app = QApplication(sys.argv)
computer = interest()
computer.show()
app.exec_() #the eighth paragraph
开始讲解框架
第一段:首先我们生成了一个名为“Princinpal”的标签,然后我们又生成了一个“double类型‘的选值框,并给这个选值框设定了它的范围0~100和初始值0,以及前缀”$“符号。
第二段:大部分操作和第一段相同,只是生成了后缀“%”符号。
第三段:第三段就有一点小不同了,因为第三段的操作对象是组合框(ComboBox)。所以我们先初始化了一个字典,然后设置标签,并将字典的键名排序后赋给组合框。
第四段:太简单,不讲了。
第五段:控件都设置好以后就开始布局。我们这里用的是网格(grid)布局。addwidget函数的详细就放到后面函数讲解那一部分吧。
第六段:设置信号和槽,并设置窗体的标题。
第七段:槽函数的实现
第八段:没啥好讲的
函数讲解
就按顺序来,先从第一段开始吧。
setrange()设置选值框的范围,setvalue()设置选值框的初始值,setPrefix()设置选值框的前缀,setBuddy()设置伙伴关系,这些看字面意思都很好懂,关键的就是呢要知道它是和哪个部件联系在一起的。另外呢,就是它们有什么作用,setBuddy有什么作用呢???诶,你刚刚不是讲了吗,这个是设置伙伴关系,可是设置伙伴关系又有什么作用呢??? 哎,这个就是我们要弄懂的。这个就与“PrincipalLabel = QLabel("&Princinpal:")“这句话里面的&有关系了,当标签里面放入一个与字符”&“时,会有两种含义:①当标签有伙伴关系时候,紧跟在与字符后面的字符会显示下划线,形成加速键,并与字符不显示出来。②单纯的字符,会显示出来。
当与字符’&‘放在多个按钮里面或者单选按钮和checkBox里面会怎样呢??自己查资料呗,我懒得敲了
后面几段都没有什么好讲的,不过addWidget()需要注意一下,它后面先跟一个QWidget类的对象,然后后面可以跟四个参数,第一个参数表示该Widget对象所在网格的行的序号,(从0开始算),第二个参数就是列的序号,第三个第四个参数表示合并的行和列数,可以不要。
注意啊,这个setlayout函数不能掉,我的理解就是它相当于设置了一个布局管理器吧,没有它,那么之前设置的布局和控件都不会显示出来。(没有查参考资料,个人想法)
其实最有意思的应该是信号的发射了,首先你得知道一个部件有哪些预定的信号吧,(你也可以自己定义一个信号,不过有现成的信号不如偷懒呗),
据查资料所得,像选值框的信号发射就是valueChanged,不过它所传递的参数有两种:int和QString。我在这个程序里面试了一下,好像两种都可以,
像组合框的话就,
当ComboBox的当前值改变时可以发出两个信号(currentIndexChanged和activated)。不管是否在程序中预先设定或存在用户交互,
currentIndexChanged总会被激发,而activated只有在存在用户交互的时候才会被激发。highlighted信号当用户点亮comboBox下拉菜单时被激发。这三种信号都存在QString和int两个版本。如果用户选择或点击一个pixmap,只有int信号会被激发。在我这个程序里,我把int和QString分别试了一下,都可以。
后面我会讲一下创建字典的几种方式。
这篇文字也是我写下来激励自己继续学下去并记录自己的学习轨迹的,也希望共勉。以下是我下这篇文字参考的一些资料。
Qt中QComboBox类常见函数与信号的使用:
http://blog.csdn.net/sbisyju/article/details/8697081
Qt之QSpinBox和QDoubleSpinBox:https://yq.aliyun.com/articles/62095
大家有兴趣就自己看看吧,后面一篇文章内容丰富详细。