#pragma once #include #include #include QT_BEGIN_NAMESPACE namespace Ui { class CalculatorForm; } QT_END_NAMESPACE // CalculatorDesigner —— 计算器面板(QWidget)。 // 【Day3 calculator_mainwindow】相对 ../calculator_designer_ext/ 版仅两处改动: // ① 新增 evaluated(expression,result) 信号:按 = 求值成功后发出,供 MainWindow // 的历史停靠窗订阅(演示「给已有部件加信号,与外壳通信」)。 // ② 新增 loadExpression(expr):把一条历史表达式回填到编辑区(演示「部件对外 // 提供 API」,配合历史双击回填)。 // 其余输入校验/状态机/求值逻辑一字未改。 class CalculatorDesigner : public QWidget { Q_OBJECT public: explicit CalculatorDesigner(QWidget* parent = nullptr); ~CalculatorDesigner() override; // 供自测直接调用,效果等价于点击对应按钮;逻辑与 ../calculator_designer_ext/ 版一字不差。 void onDigit(int digit); void onDot(); void onOperator(QChar op); void onLeftParen(); void onRightParen(); void onEquals(); void onClear(); void onBackspace(); QString displayText() const; QString expressionText() const; // 【新增】把一条历史表达式回填到编辑区(历史双击时调用)。 void loadExpression(const QString& expr); signals: // 【新增】按 = 求值成功后发出,参数为(自动补全括号后的表达式, 结果文本)。 void evaluated(const QString& expression, const QString& result); private: // 单个运算数(数字串)允许的最大长度,要求不得小于 10 位。 static constexpr int kMaxOperandLength = 15; static_assert(kMaxOperandLength >= 10, "单个运算数的最大长度不得小于 10 位"); // 表达式总长度上限,要求不得低于 100 个字符。 static constexpr int kMaxExpressionLength = 200; static_assert(kMaxExpressionLength >= 100, "表达式总长度上限不得低于 100 个字符"); QString currentOperandToken() const; int currentOperandDigitCount() const; QString lastNumberToken() const; void refreshDisplays(); void showError(); Ui::CalculatorForm* ui; QString m_expression; // 当前正在编辑的表达式,例如 "12+3*(4-2" QString m_lastResultText; // 上一次成功计算得到的结果文本 int m_openParenCount = 0; // 尚未闭合的左括号数量 bool m_resultShown = false; // 显示区当前展示的是计算结果而非正在输入的数字 bool m_error = false; };