QML设计计算器,通过python调用
计算器
如果有需要项目源码的可以关注微信公众号: Belated to bide
1、使用qt design studio画出计算器界面
在design studio界面创建新项目,按下图操作
在设计界面中拖动控件来设计计算器界面如下图所示:
控制按钮都使用Button,显示按钮使用text,通过anchor来控制每个控件距离边界的大小,使得控件大小可随界面大小而改变。右击每个Button控件,使用Connections连接,在onClicked内调用python写的槽函数。
2、使用python编写相应的槽函数
获得按钮上的内容,将其放到字符串当中,槽函数如下。其中get_ui(txt,‘text’)是获取控件上的内容,set_ui([‘text1’, ‘text’, self.t2 ])是设置显示框的显示内容。
@pyqtSlot(str)
def clickNum(self,txt):
if self.get_ui(txt,'text') in \
['0','1','2','3','4','5','6','7','8','9',
'.','( ',' )',' + ',' - ',' × ',' ÷ ']:
self.t1 = self.get_ui(txt,'text')
self.t2 = self.t2 + self.t1
self.t1 = ""
self.set_ui(['text1', 'text', self.t2 ])
这里因为需要考虑优先级的问题,所以将得到的中缀表达式转换为逆波兰表达式,再计算逆波兰表达式的值,即可得到计算结果。开根号,平方,求倒数,求阶乘需要单独编写槽函数。求阶乘的槽函数如下:
@pyqtSlot()
def fac(self):
if self.t2 == "":
self.set_ui(['text1', 'text', self.t2])
else:
a = 1
for i in range(int(self.t2)):
a = (i+1)*a
self.set_ui(['text1', 'text', a])
self.t2 = str(a)
其中逆波兰表达式的计算可以自行百度,这里不做过多的赘述,代码如下:
def eval_rpn(tokens):
results = []
operators = set(["+","-","×","÷"])
for token in tokens:
if token not in operators:
results.append(float(token))
else:
num2 = results.pop()
num1 = results.pop()
if token == "+":
results.append(round(num1 + num2,3))
elif token == "-":
results.append(round(num1 - num2,3))
elif token == "×":
results.append(round(num1 * num2,3))
elif token == "÷":
if num2 == 0:
results = []
results.append("input error! please input again.")
break
# raise ValueError("除数为零!")
results.append(round(num1 / num2,3))
return results[0]
还需要在main.py当中加载QML窗口并创建与QML界面交互的对象。
完整代码可关注微信公众号:Belated to bide