#include "editorwidget.h" #include #include #include #include #include #include EditorWidget::EditorWidget(QWidget* parent) : QWidget(parent) { // 主垂直布局(包含上部编辑区和下部输出框) QVBoxLayout* mainLayout = new QVBoxLayout(this); mainLayout->setContentsMargins(10, 10, 10, 10);//布局管理器内边距 mainLayout->setSpacing(10);//布局内容之间边距 // 上部容器(包含工具栏和编辑区) QWidget* topContainer = new QWidget(); QHBoxLayout* topLayout = new QHBoxLayout(topContainer); topLayout->setContentsMargins(10, 10, 10, 10); topLayout->setSpacing(10); // 左侧工具栏布局 QVBoxLayout* leftLayout = new QVBoxLayout(); leftLayout->setSpacing(5); // 初始化工具栏 toolbar = new QListWidget(this); toolbar->setViewMode(QListWidget::IconMode); toolbar->setIconSize(QSize(48, 48)); toolbar->setFixedWidth(100); toolbar->setSpacing(10); toolbar->setDragEnabled(false); leftLayout->addWidget(toolbar); // 初始化编辑区域 editArea = new QGraphicsView(this); editArea->setRenderHint(QPainter::Antialiasing);//抗锯齿 editArea->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);//全视口更新 editArea->setOptimizationFlags(QGraphicsView::DontSavePainterState | QGraphicsView::DontAdjustForAntialiasing); editArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);//按需显示滚动条 editArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); //editArea->setDragMode(QGraphicsView::ScrollHandDrag); // 添加到上部布局 topLayout->addLayout(leftLayout); topLayout->addWidget(editArea, 1); // 初始化输出框 outputTextEdit = new QTextEdit(this); outputTextEdit->setReadOnly(true); outputTextEdit->setFixedHeight(120); outputTextEdit->setStyleSheet( "QTextEdit {" " background-color: #f0f0f0;" " border: 1px solid #cccccc;" " padding: 5px;" " font-family: Consolas, 'Courier New', monospace;" " font-size: 10pt;" "}" ); // 添加到主布局 mainLayout->addWidget(topContainer, 1); mainLayout->addWidget(outputTextEdit); // 安装事件过滤器 editArea->installEventFilter(this); // 连接工具栏点击信号 connect(toolbar, &QListWidget::itemClicked, this, &EditorWidget::onToolbarItemClicked); appendOutput("编辑器初始化完成"); } EditorWidget::~EditorWidget() {} void EditorWidget::appendOutput(const QString& message) { QString timestamp = QDateTime::currentDateTime().toString("[hh:mm:ss] "); outputTextEdit->append(timestamp + message); QTextCursor cursor = outputTextEdit->textCursor(); cursor.movePosition(QTextCursor::End); outputTextEdit->setTextCursor(cursor); } //界面初始化 void EditorWidget::ensureViewReady() { //强制处理 QCoreApplication::processEvents(); //重置 editArea->resetTransform(); //视图更新 editArea->viewport()->update(); //如果为空 if (editArea->viewport()->rect().isEmpty()) { editArea->setFixedSize(600, 400); QCoreApplication::processEvents(); } } void EditorWidget::showEvent(QShowEvent* event) { QWidget::showEvent(event); //首次显示 if (firstShow) { firstShow = false; ensureViewReady(); } } void EditorWidget::resizeEvent(QResizeEvent* event) { QWidget::resizeEvent(event); ensureViewReady(); } bool EditorWidget::eventFilter(QObject* obj, QEvent* event) { if (obj == editArea && event->type() == QEvent::ContextMenu) { // 可由派生类扩展上下文菜单逻辑 return true; } return QWidget::eventFilter(obj, event); } void EditorWidget::keyPressEvent(QKeyEvent* event) { // 可由派生类扩展键盘事件逻辑 QWidget::keyPressEvent(event); }