初始化:图形化界面骨架(文件选择、语法高亮、自动缩进、查找/替换)
This commit is contained in:
175
mainwindow.cpp
Normal file
175
mainwindow.cpp
Normal file
@@ -0,0 +1,175 @@
|
||||
#include "mainwindow.h"
|
||||
|
||||
#include <QMenuBar>
|
||||
#include <QMenu>
|
||||
#include <QAction>
|
||||
#include <QSplitter>
|
||||
#include <QMessageBox>
|
||||
#include <QFileDialog>
|
||||
|
||||
#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);
|
||||
}
|
||||
Reference in New Issue
Block a user