|
- #include "editorwidget.h"
- #include <QVBoxLayout>
- #include <QHBoxLayout>
- #include <QCoreApplication>
- #include <QDateTime>
- #include <QKeyEvent>
- #include <QContextMenuEvent>
-
- 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);
- }
|