1 ui设计
使用qt designer ,按装anaconda后,在如下路径找到:
conda3.05libraryin
designer.exe文件,双击启动:
创建窗体,命名为xiaoding,整个的界面如下所示:
私信小编01 领取完整项目代码
qt 设计器提供的常用控件基本都能满足开发需求,通过拖动左侧的控件,很便捷的就能搭建出如下的ui界面,比传统的手写控件代码要方便很多。
最终设计的计算器xiaoding界面如下,
比如,其中一个用于计算器显示的对象:lcdnumber,对象的类型为:lcd number。右侧为计算器中用到的所有对象。
2 转py文件
使用如下命令,将设计好的ui文件转为py文件
pyuic5 -o ./calculator/mainwindow.py ./calculator/mainwindow.ui
3 计算器实现逻辑
导入库:
frompyqt5.qtguiimport* frompyqt5.qtwidgetsimport* frompyqt5.qtcoreimport* importoperator frommainwindowimportui_mainwindow
主题代码逻辑很精简:
#calculatorstate. ready=0 input=1 classmainwindow(qmainwindow,ui_mainwindow): def__init__(self,*args,**kwargs): super(mainwindow,self).__init__(*args,**kwargs) self.setupui(self) #setupnumbers. forninrange(0,10): getattr(self,'pushbutton_n%s'%n).pressed.connect(lambdav=n:self.input_number(v)) #setupoperations. self.pushbutton_add.pressed.connect(lambda:self.operation(operator.add)) self.pushbutton_sub.pressed.connect(lambda:self.operation(operator.sub)) self.pushbutton_mul.pressed.connect(lambda:self.operation(operator.mul)) self.pushbutton_div.pressed.connect(lambda:self.operation(operator.truediv))#operator.divforpython2.7 self.pushbutton_pc.pressed.connect(self.operation_pc) self.pushbutton_eq.pressed.connect(self.equals) #setupactions self.actionreset.triggered.connect(self.reset) self.pushbutton_ac.pressed.connect(self.reset) self.actionexit.triggered.connect(self.close) self.pushbutton_m.pressed.connect(self.memory_store) self.pushbutton_mr.pressed.connect(self.memory_recall) self.memory=0 self.reset() self.show()
基础方法:
definput_number(self,v): ifself.state==ready: self.state=input self.stack[-1]=v else: self.stack[-1]=self.stack[-1]*10+v self.display() defdisplay(self): self.lcdnumber.display(self.stack[-1])
按钮re,m, re对应的实现逻辑:
defreset(self): self.state=ready self.stack=[0] self.last_operation=none self.current_op=none self.display() defmemory_store(self): self.memory=self.lcdnumber.value() defmemory_recall(self): self.state=input self.stack[-1]=self.memory self.display()
+,-,x,/,/100对应实现方法:
defoperation(self,op): ifself.current_op:#completethecurrentoperation self.equals() self.stack.append(0) self.state=input self.current_op=op defoperation_pc(self): self.state=input self.stack[-1]*=0.01 self.display()
=号对应的方法实现:
defequals(self): ifself.state==readyandself.last_operation: s,self.current_op=self.last_operation self.stack.append(s) ifself.current_op: self.last_operation=self.stack[-1],self.current_op try: self.stack=[self.current_op(*self.stack)] exceptexception: self.lcdnumber.display('err') self.stack=[0] else: self.current_op=none self.state=ready self.display()
main函数:
if__name__=='__main__': app=qapplication([]) app.setapplicationname(xiaoding) window=mainwindow() app.exec_()
完整代码请参考点击阅读原文下载,代码只有100行。完整代码请点击文章最底部的【阅读原文】。启动后的界面如下:
罗技发布MX Master 3无线鼠标和MX keys无线键盘
国内数控机床到底怎么样呢?
双速电机接线图
国家难买单 光伏发电高成本
中美贸易摩擦加剧,全球光模块市场会受到怎样的影响?
如何使用Python制作一款计算器
Nokia申请新专利 柔性手机有盼头
充气柜变压器是什么,它的功能都有哪些
四个现象六大趋势—从CES看数字化革命的进程
移远为汽车行业带来两款全新车载安卓智能模组
雷曼光电荣膺2023行家极光奖三大年度奖项
为什么选择软件定义GNSS模拟器?优势有这些
汇顶科技进入触控IC市场 商业化NB-Ito即将推出
【首创】三方平台入OH主线,RK3568标准系统芯片平台适配
如果说除了小米以外,还有哪些手机能够被称为价格屠夫?
通用领域大规模条件性知识图谱数据集
云计算已证明将会彻底改变会计行业,但是物联网呢?
OPPOR1s拆解评测:超越前代不止于屏
亚马逊前高管解答如何打造一台创新机器?
STM32中的位带(bit-band)操作