主要内容 #
1. 应用介绍 #
该应用的主要功能是实现简易的计算器
包括主要的加减乘除运算功能。
2. 功能解构 #
根据应用的需求,现对计算器的功能进行解构,具体如下:
- 1,界面:需要一个文本输入框(QLineEdit),用于展示计算器计算的数字。
- 2,界面:需要若干个按钮(QPushButton),用于作为计算器的数字按钮和运算符按钮。
- 3,功能:需要实现输入数字的功能,并且支持正负号和小数点。
- 4,功能:需要实现运算符和等于号的功能。
以下将逐步完成每个模块的功能
3. 界面设计 #
首先,在通用框架中添加如下控件:文本输入框,按钮和消息框。
import sys from PyQt5.QtWidgets import (QMainWindow, QWidget, QApplication, QLineEdit, QPushButton, QGridLayout) from PyQt5.QtGui import QRegExpValidator from PyQt5.QtCore import Qt, QRegExp class Calculator(QWidget): def __init__(self): super().__init__() self.initUI() # 如下是必须的参数,后续会一一介绍并使用,这里先初始化。 self.char_stack = [] # 运算符保存列表 self.num_stack = [] # 数字保存列表 self.nums = [chr(i) for i in range(48, 58)] # 字符串版本的数字 self.operators = ['+', '-', '*', '/'] # 运算符 self.empty_flag = True # flag self.after_operator = False # 是否在运算符后面的数字 self.express = '' # self.char_top = '' # top的运算符 self.num_top = 0 # top的数字 self.res = 0 # 最终结果 # >先计算, 为什么同样的符号改成了后计算, 是为了方便做一项操作, # 就是在你计算一个表达式之后,在继续按住等号, 以及会执行最后一次的符号运算 self.priority_map = { '++': '>', '+-': '>', '-+': '>', '--': '>', '+*': '<', '+/': '<', '-*': '<', '-/': '<', '**': '>', '//': '>', '*+': '>', '/+': '>', '*-': '>', '/-': '>', '*/': '>', '/*': '>' } # 运算符优先级 def initUI(self): reg = QRegExp("^$") # 可选,把键盘禁用了, 仅可以按钮的输入 validator = QRegExpValidator(reg, self) self.line_edit = QLineEdit('0', self) # 文本框增加,默认数字是0 self.line_edit.setAlignment(Qt.AlignRight) # 右对齐,数字都默认在最右边 self.line_edit.setValidator(validator) # 将键盘禁用 self.line_edit.setReadOnly(True) # 将文本框设置为只读,不能直接在文本框键入文本 grid = QGridLayout() # 网格布局 self.setLayout(grid) btn_names = [ 'C', '+/-', 'x', '/', '7', '8', '9', '*', '4', '5', '6', '-', '1', '2', '3', '+', '0', '', '.', '=' ] # 键盘按钮 grid.addWidget(self.line_edit, 0, 0, 1, 4) # 将QLineEdit组件加入到布局layout中,后面参数表示行下标,列下标,占用行,占用列 positions = [(i, j) for i in range(1, 6) for j in range(4)] for pos, name in zip(positions, btn_names): if name == '': continue btn = QPushButton(name) # 新增按钮 if name == '0': tmp_pos = (pos[0], pos[1] + 1) grid.addWidget(btn, *pos, 1, 2) # 将QPushButton组件加入到布局layout中,后面参数表示行下标,列下标,占用行,占用列 else: grid.addWidget(btn, *pos) # 将QPushButton组件加入到布局layout中,后面参数表示行下标,列下标 self.setFocusPolicy(Qt.StrongFocus) # 设置焦点获取策略:支持tab和单击 self.setWindowTitle('QTCalculator') self.move(300, 150) self.show() app = QApplication(sys.argv) ex = Calculator() app.exec_()
4. 小结 #
- 计算器是常见的计算工具,其功能可以简单也可以很复杂。
- 根据计算器的功能可以将计算器解构,方便后续代码实现。
- 计算器界面上需要文本框,按钮等界面。
习题 #
- 无