跳至正文
View Categories

1 min read

主要内容 #

  • 应用介绍
  • 功能解构
  • UI设计
  • 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. 小结 #

    • 计算器是常见的计算工具,其功能可以简单也可以很复杂。
    • 根据计算器的功能可以将计算器解构,方便后续代码实现。
    • 计算器界面上需要文本框,按钮等界面。

    习题 #