#include "mainwindow.h" #include #include #include #include #include #include #include "ui/filebrowserwidget.h" #include "ui/codeeditorwidget.h" #include "backend/compileprocessmanager.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { createActions(); createMenus(); setupCentralWidgets(); m_compileManager = new CompileProcessManager(this); connectSignals(); setWindowTitle(tr("My Compiler IDE")); resize(1200, 800); } MainWindow::~MainWindow() { } void MainWindow::createActions() { // File m_actNew = new QAction(tr("&New"), this); m_actOpen = new QAction(tr("&Open..."), this); m_actSave = new QAction(tr("&Save"), this); m_actExit = new QAction(tr("E&xit"), this); // Build / Run m_actBuild = new QAction(tr("&Build"), this); m_actRun = new QAction(tr("&Run"), this); // 可以设置快捷键 m_actNew->setShortcut(QKeySequence::New); m_actOpen->setShortcut(QKeySequence::Open); m_actSave->setShortcut(QKeySequence::Save); m_actExit->setShortcut(QKeySequence::Quit); m_actBuild->setShortcut(Qt::Key_F5); m_actRun->setShortcut(Qt::Key_F6); } void MainWindow::createMenus() { // File 菜单 QMenu *fileMenu = menuBar()->addMenu(tr("&File")); fileMenu->addAction(m_actNew); fileMenu->addAction(m_actOpen); fileMenu->addAction(m_actSave); fileMenu->addSeparator(); fileMenu->addAction(m_actExit); // Edit 菜单(先占位,之后可以加撤销/重做/查找等) QMenu *editMenu = menuBar()->addMenu(tr("&Edit")); Q_UNUSED(editMenu); // Build 菜单 QMenu *buildMenu = menuBar()->addMenu(tr("&Build")); buildMenu->addAction(m_actBuild); buildMenu->addAction(m_actRun); // Help 菜单(占位) QMenu *helpMenu = menuBar()->addMenu(tr("&Help")); Q_UNUSED(helpMenu); } void MainWindow::setupCentralWidgets() { // 左右分割:左文件列表、右代码编辑区 QSplitter *splitter = new QSplitter(Qt::Horizontal, this); m_fileBrowser = new FileBrowserWidget(splitter); m_codeEditor = new CodeEditorWidget(splitter); splitter->setStretchFactor(0, 1); // 文件列表 splitter->setStretchFactor(1, 3); // 代码编辑 setCentralWidget(splitter); } void MainWindow::connectSignals() { // 菜单动作 connect(m_actNew, &QAction::triggered, this, &MainWindow::onActionNewFile); connect(m_actOpen, &QAction::triggered, this, &MainWindow::onActionOpenFile); connect(m_actSave, &QAction::triggered, this, &MainWindow::onActionSaveFile); connect(m_actExit, &QAction::triggered, this, &MainWindow::onActionExit); connect(m_actBuild, &QAction::triggered, this, &MainWindow::onActionBuild); connect(m_actRun, &QAction::triggered, this, &MainWindow::onActionRun); // 编译完成信号 connect(m_compileManager, &CompileProcessManager::compileFinished, this, &MainWindow::onCompileFinished); // 文件列表点击打开文件(后面可以在 FileBrowserWidget 里发信号) connect(m_fileBrowser, &FileBrowserWidget::fileOpenRequested, m_codeEditor, &CodeEditorWidget::loadFromFile); } // ========== 菜单槽函数(先简单占位) ========== void MainWindow::onActionNewFile() { m_codeEditor->clearEditor(); } void MainWindow::onActionOpenFile() { QString filePath = QFileDialog::getOpenFileName(this, tr("Open File")); if (filePath.isEmpty()) return; m_codeEditor->loadFromFile(filePath); } void MainWindow::onActionSaveFile() { // 简单实现:如果 CodeEditor 里自己记录了当前文件路径,就直接保存 // 否则先弹出另存为。这里先调用一个占位接口,具体实现之后我们再做。 if (!m_codeEditor->save()) { QString filePath = QFileDialog::getSaveFileName(this, tr("Save File")); if (!filePath.isEmpty()) { m_codeEditor->saveAs(filePath); } } } void MainWindow::onActionExit() { close(); } void MainWindow::onActionBuild() { // 获取当前编辑器中的代码文本 QString code = m_codeEditor->currentText(); // TODO: 这里可以根据 code / 当前选中的编译选项,生成指令、参数等 // 目前先简单把 code 直接发给后端,后面你告诉我后端协议,我们再细化 m_compileManager->runCompile(code); } void MainWindow::onActionRun() { // TODO: 之后可以根据编译结果调用可执行文件运行,或者编译+运行 QMessageBox::information(this, tr("Run"), tr("Run action triggered (TODO).")); } void MainWindow::onCompileFinished(const QString &stdoutText, const QString &stderrText, int exitCode) { // 这里先简单弹个窗口,后面我们可以加“底部控制台”面板输出 QString msg = tr("Exit code: %1\n\nSTDOUT:\n%2\n\nSTDERR:\n%3") .arg(exitCode) .arg(stdoutText) .arg(stderrText); QMessageBox::information(this, tr("Build Result"), msg); }