1、创建计算器界面
创建计算器界面使用Qtdesigner创建计算器标准界面的主要内容,包含0~9的数字按键、加减乘除四则运算、三角函数、对数函数、十进制转换二进制、清空、退格和等于控件。为了美化界面将计算器添加背景并将按钮和运算对话框设置一定的透明度,增加按钮按下的阴影效果
使用Qt Designer,可以通过拖放组件来构建用户界面,设置组件的属性,编写布局代码等。它提供了丰富的组件库,包括按钮、标签、文本输入框、下拉框等,以及容器组件如窗口、对话框和布局管理器。可以调整组件的大小和位置,设置样式和外观,快速创建复杂的用户界面。Pyuic工具可以方便地将通过Qt Designer创建的UI文件转换为Python代码,这个过程不需要手动编写Python代码,从而大大提高了开发效率。
2、信号与槽
由于使用Qtdesinger创建图形界面是信号与槽的设置相对单一,所以只是用Qtdesinger作出相对简单的图形界面开发
对按键的信号与槽的开发使用python编译器添加点击事件和函数以按下数字“0”按键为例:
在图形界面中放入一个按钮按键
self.pushButton_0 = QtWidgets.QPushButton(self.centralwidget) 设置按钮的点击事件当按钮被点击时执行prs_bt0函数
mainWindow.pushButton_0.clicked.connect(mainWindow.prs_bt0)
书写prs_bt0函数内容当按钮被点击时向对话框插入0
def prs_bt0(self): self.lineEdit.insert('0')
如此就可以实现创建按钮0,按钮点击事件的响应
3、双栈法实现计算结果
其基本思想如下:
- 初始化一个运算符栈和一个操作数栈
- 从算术表达式输入的字符串中从左到右的读取一个字符
- 若当前字符为操作数,则直接将该操作数压入操作数栈中
- 若当前字符是左括号"("时,将其压入运算符栈中
- 若当前字符为运算符时,则:
- 当运算符栈为空的时候,则将其压入运算符栈中
- 当此运算符的优先级高于栈顶元素的运算符的时候,则将此运算符压入操作数栈中,否则,弹出运算符栈顶元素和操作数栈顶的两个元素,为其添加上相应的运算符以及左括号和右括号之后,将其压入操作数栈中,将其看成一个整体
- 若当前字符为右括号")"时,反复将栈顶元素弹出,每次弹出一个运算符的时候,从操作数栈中弹出栈顶的两个元素为其添加上相应的运算符以及左右括号之后,再将其压入操作数栈中,将其看成一个整体。直至运算符栈的栈顶元素为左括号为止,再将左括号出栈并丢弃。
- 若读取还未完毕,重复步骤2
- 若读取完毕,则将栈中剩余的所有运算符依次弹出,每次弹出一个运算符时,同时弹出操作数栈的两个元素,并为其添加上相应的运算符以及左右括号之后,将其作为一个整体,压入操作数栈中。直到运算符栈为空为止,则操作数栈中的结果,即为所得的结果。
建立两个栈,一个是数据栈,一个是计算符号栈,以(6+2*5)/4为例
1 优先级
符号之间的优先级如下:
"(" , ")" -1
"+" , "-" 0
"*" , "/" 1
数值越大,则越优先,同级别的比较时 先出现的优先。
2 将"(",")"设为特殊运算符,即单目运算,两邻两个运算符则可对消。
3 计算条件
(1) 当前运算符不等于""(特殊结束符)
(2) 运算符栈里的运行算个数>=1时
(3) 出栈口的运算符优先级高于将要入栈的运算符时或者两者可对消时。
4 计算时,则将符号出栈参与计算,数值栈的出栈口前两位元素出栈参与计算,
计算结果值向数值栈压栈,并进行递归此操作。具体步骤如下:
(1) "(" 压入符号栈
(2) "6"压入数值栈
(3) "("与"+"比较优先级,认为"("比"+"优先级低,则不满足计算条件,将"+"压入符号栈.
(4) 将"2" 压入数值栈。
(5) 将"*"与"+"比较优先级,算得"+"优先级低于"*",则不满足计算条件,将"*"压入符号栈。
(6) 将 "5"压入数植栈。
(7) 将"*"与")"比较优先级,得出"*"比")"优先级要高。进行计算,将"*"出栈、"5"、"2"出栈,参与计算
(8) 将 2*5 =10的结果压入数值栈。
(9) (递归)比较 "+"与")"优先级,得出"+"比")"优先级要高。再进行计算,将"+"出栈、"10"、"6"出栈,参与计算。
(10) 将 6+10 =16的结果压入数值栈。
(11) (递归)比较 ")"与"("优先级,得出两者可以对消,将"("符号出栈,与")"对消,继续取下一个符号。
(12) 将"/"入符号栈。
(13) 将"4"入数值栈。
(14) 发现""算式结束符,则进行计算, 将 "/"、"4’、"16"出栈,参与计算。
(15) 将计算结果压入数值栈。