// ============================================================================ // mainwindow.h —— Day3 上午版:把增强版计算器装进 QMainWindow // // 对应教案 OUTLINE_4DAY.md Day3 上午「QMainWindow / 对话框 QDialog」。 // 本类只做「外壳」:菜单栏 / 状态栏 / 历史停靠窗 + 把 CalculatorDesigner // 作为中心部件 setCentralWidget。计算器面板本身的输入/求值逻辑一字未改 // (见 calculatordesigner.cpp)——这正是「界面外壳升级、核心部件不动」 // 的关注点分离演示。 // // 与 mainwindow_showcase 的风格对照(同为 Day3 上午教学载体): // - mainwindow_showcase:.ui 表单定义主窗体结构 + on__ 自动连接 // - 本例:纯代码建菜单/停靠窗 + 显式 connect() // 两种风格并列,前者突出「Designer 快速搭骨架」,后者突出「QAction 必须 // connect 才生效」(Day3 上午坑卡:菜单显示正常点了没反应)。 // ============================================================================ #ifndef CALCULATOR_MAINWINDOW_H #define CALCULATOR_MAINWINDOW_H #include class CalculatorDesigner; class QListWidget; class QListWidgetItem; class QDockWidget; class QAction; class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget* parent = nullptr); ~MainWindow() override; // 离屏自测:复用 Day2 的 9 组计算用例 + Day3 新增(历史追加 / 双击回填 / // 关于对话框触发)。返回全过为 true,供 main.cpp 决定退出码。 bool runSelfTest(); private slots: void onAbout(); // 帮助→关于:QMessageBox::about void onClearHistory(); // 编辑→清空历史 void onToggleHistoryVisible(bool checked); // 视图→显示历史 void onEvaluated(const QString& expr, const QString& result); // 计算器求值→追加历史 void onHistoryDoubleClicked(QListWidgetItem* item); // 双击历史→回填表达式 private: void buildMenu(); void buildDock(); void buildStatusBar(); void refreshStatus(const QString& msg); CalculatorDesigner* m_calc = nullptr; QListWidget* m_history = nullptr; QDockWidget* m_dock = nullptr; QAction* m_actQuit = nullptr; QAction* m_actClearHistory = nullptr; QAction* m_actToggleHistory = nullptr; QAction* m_actAbout = nullptr; }; #endif // CALCULATOR_MAINWINDOW_H