Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

125 rader
3.9 KiB

  1. #include "editorwidget.h"
  2. #include <QVBoxLayout>
  3. #include <QHBoxLayout>
  4. #include <QCoreApplication>
  5. #include <QDateTime>
  6. #include <QKeyEvent>
  7. #include <QContextMenuEvent>
  8. EditorWidget::EditorWidget(QWidget* parent) : QWidget(parent) {
  9. // 主垂直布局(包含上部编辑区和下部输出框)
  10. QVBoxLayout* mainLayout = new QVBoxLayout(this);
  11. mainLayout->setContentsMargins(10, 10, 10, 10);//布局管理器内边距
  12. mainLayout->setSpacing(10);//布局内容之间边距
  13. // 上部容器(包含工具栏和编辑区)
  14. QWidget* topContainer = new QWidget();
  15. QHBoxLayout* topLayout = new QHBoxLayout(topContainer);
  16. topLayout->setContentsMargins(10, 10, 10, 10);
  17. topLayout->setSpacing(10);
  18. // 左侧工具栏布局
  19. QVBoxLayout* leftLayout = new QVBoxLayout();
  20. leftLayout->setSpacing(5);
  21. // 初始化工具栏
  22. toolbar = new QListWidget(this);
  23. toolbar->setViewMode(QListWidget::IconMode);
  24. toolbar->setIconSize(QSize(48, 48));
  25. toolbar->setFixedWidth(100);
  26. toolbar->setSpacing(10);
  27. toolbar->setDragEnabled(false);
  28. leftLayout->addWidget(toolbar);
  29. // 初始化编辑区域
  30. editArea = new QGraphicsView(this);
  31. editArea->setRenderHint(QPainter::Antialiasing);//抗锯齿
  32. editArea->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);//全视口更新
  33. editArea->setOptimizationFlags(QGraphicsView::DontSavePainterState | QGraphicsView::DontAdjustForAntialiasing);
  34. editArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);//按需显示滚动条
  35. editArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
  36. //editArea->setDragMode(QGraphicsView::ScrollHandDrag);
  37. // 添加到上部布局
  38. topLayout->addLayout(leftLayout);
  39. topLayout->addWidget(editArea, 1);
  40. // 初始化输出框
  41. outputTextEdit = new QTextEdit(this);
  42. outputTextEdit->setReadOnly(true);
  43. outputTextEdit->setFixedHeight(120);
  44. outputTextEdit->setStyleSheet(
  45. "QTextEdit {"
  46. " background-color: #f0f0f0;"
  47. " border: 1px solid #cccccc;"
  48. " padding: 5px;"
  49. " font-family: Consolas, 'Courier New', monospace;"
  50. " font-size: 10pt;"
  51. "}"
  52. );
  53. // 添加到主布局
  54. mainLayout->addWidget(topContainer, 1);
  55. mainLayout->addWidget(outputTextEdit);
  56. // 安装事件过滤器
  57. editArea->installEventFilter(this);
  58. // 连接工具栏点击信号
  59. connect(toolbar, &QListWidget::itemClicked, this, &EditorWidget::onToolbarItemClicked);
  60. appendOutput("编辑器初始化完成");
  61. }
  62. EditorWidget::~EditorWidget() {}
  63. void EditorWidget::appendOutput(const QString& message) {
  64. QString timestamp = QDateTime::currentDateTime().toString("[hh:mm:ss] ");
  65. outputTextEdit->append(timestamp + message);
  66. QTextCursor cursor = outputTextEdit->textCursor();
  67. cursor.movePosition(QTextCursor::End);
  68. outputTextEdit->setTextCursor(cursor);
  69. }
  70. //界面初始化
  71. void EditorWidget::ensureViewReady() {
  72. //强制处理
  73. QCoreApplication::processEvents();
  74. //重置
  75. editArea->resetTransform();
  76. //视图更新
  77. editArea->viewport()->update();
  78. //如果为空
  79. if (editArea->viewport()->rect().isEmpty()) {
  80. editArea->setFixedSize(600, 400);
  81. QCoreApplication::processEvents();
  82. }
  83. }
  84. void EditorWidget::showEvent(QShowEvent* event) {
  85. QWidget::showEvent(event);
  86. //首次显示
  87. if (firstShow) {
  88. firstShow = false;
  89. ensureViewReady();
  90. }
  91. }
  92. void EditorWidget::resizeEvent(QResizeEvent* event) {
  93. QWidget::resizeEvent(event);
  94. ensureViewReady();
  95. }
  96. bool EditorWidget::eventFilter(QObject* obj, QEvent* event) {
  97. if (obj == editArea && event->type() == QEvent::ContextMenu) {
  98. // 可由派生类扩展上下文菜单逻辑
  99. return true;
  100. }
  101. return QWidget::eventFilter(obj, event);
  102. }
  103. void EditorWidget::keyPressEvent(QKeyEvent* event) {
  104. // 可由派生类扩展键盘事件逻辑
  105. QWidget::keyPressEvent(event);
  106. }