05a685c952
- calculator_designer_ext(Day2 增强版:表达式求值 + 括号,递归下降解析器)接入 cmake - calculator_mainwindow(Day3 上午):增强版计算器装进 QMainWindow, 菜单/状态栏/历史停靠窗,纯代码 + 显式 connect,与 mainwindow_showcase 形成坑卡对照 - calculator_mainwindow_qss(Day3 下午):上午版 + QSS 双主题美化(按键分色/伪状态/深浅切换) - 验证 mainwindow_showcase(QMainWindow 六大组件综合演示,.ui + .qrc) - OUTLINE_4DAY.md / ASSIGNMENTS.md Day3 衔接增强版起点 + 参考实现指引 - 补提交 Day2 calculator/ 与 calculator_designer/ 参考实现(CMakeLists 已引用) - 全量构建 28/28,4 目标离屏自测退出码 0 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
67 lines
2.6 KiB
C++
67 lines
2.6 KiB
C++
#pragma once
|
|
|
|
#include <QChar>
|
|
#include <QString>
|
|
#include <QWidget>
|
|
|
|
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;
|
|
};
|