You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

672 lines
21 KiB

  1. #include "hmidocument.h"
  2. #include "graphicsitems.h"
  3. #include <QGraphicsItem>
  4. #include <QGraphicsSceneHoverEvent>
  5. #include <QMouseEvent>
  6. #include <QMenu>
  7. #include <QAction>
  8. #include <QDataStream>
  9. #include <QColorDialog>
  10. #include <QDialog>
  11. #include <QFormLayout>
  12. #include <QLineEdit>
  13. #include <QPushButton>
  14. #include <QDialogButtonBox>
  15. #include <QMimeData>
  16. #include <QDragEnterEvent>
  17. #include <QDropEvent>
  18. #include <QDebug>
  19. #include <QFileInfo>
  20. #include <QVBoxLayout>
  21. #include <QJsonArray>
  22. #include <QJsonDocument>
  23. #include <QJsonObject>
  24. HMIDocument::HMIDocument(QWidget *parent)
  25. : BaseDocument(HMI, parent),
  26. m_title("未命名HMI"),
  27. m_canDrawEllipse(false),
  28. m_canDrawRectangle(false),
  29. m_lastPastePos(0, 0)
  30. {
  31. // 创建绘图场景 - 固定大小
  32. m_scene = new QGraphicsScene(this);
  33. m_scene->setSceneRect(0, 0, 1000, 600); // 固定画布尺寸
  34. m_scene->setBackgroundBrush(QBrush(Qt::lightGray));
  35. // 创建视图 - 关键修改:使用滚动区域包装
  36. m_scrollArea = new QScrollArea(this);
  37. m_scrollArea->setWidgetResizable(false); // 禁止内容自动调整大小
  38. //m_scrollArea->setFrameShape(QFrame::NoFrame); // 无边框
  39. // 创建真正的视图部件
  40. m_view = new QGraphicsView(m_scene, this);
  41. m_view->setRenderHint(QPainter::Antialiasing);
  42. m_view->setDragMode(QGraphicsView::RubberBandDrag);
  43. m_view->setAcceptDrops(true);
  44. m_view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // 隐藏自身滚动条
  45. m_view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
  46. // 关键:视图固定大小与场景匹配
  47. m_view->setMinimumSize(1000, 600);
  48. m_view->setMaximumSize(1000, 600);
  49. m_view->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
  50. m_view->viewport()->installEventFilter(this);
  51. // 添加视图到滚动区域
  52. m_scrollArea->setWidget(m_view);
  53. m_scrollArea->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
  54. // 设置主布局
  55. auto layout = new QVBoxLayout(this);
  56. layout->setContentsMargins(0, 0, 0, 0);
  57. layout->addWidget(m_scrollArea);
  58. setLayout(layout);
  59. }
  60. HMIDocument::~HMIDocument()
  61. {
  62. }
  63. // 事件过滤器(处理绘图、拖拽等事件)
  64. bool HMIDocument::eventFilter(QObject *obj, QEvent *event)
  65. {
  66. if (obj != m_view->viewport())
  67. {
  68. return QWidget::eventFilter(obj, event);
  69. }
  70. // 鼠标按下事件(绘制图形)
  71. if (event->type() == QEvent::MouseButtonPress)
  72. {
  73. QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
  74. setModified(true);
  75. if (mouseEvent->button() == Qt::RightButton)
  76. {
  77. showContextMenu(mouseEvent->globalPos());// 右键菜单
  78. return true;
  79. }
  80. if (mouseEvent->button() == Qt::LeftButton)
  81. {
  82. QPointF scenePos = m_view->mapToScene(mouseEvent->pos());
  83. QGraphicsItem *item = m_scene->itemAt(scenePos, m_view->transform());
  84. // 如果点击空白区域且有绘制标志,创建图形
  85. if (!item) {
  86. if (m_canDrawEllipse)
  87. {
  88. createShape("ellipse", scenePos);
  89. resetDrawFlags();
  90. }
  91. else if (m_canDrawRectangle)
  92. {
  93. createShape("rectangle", scenePos);
  94. resetDrawFlags();
  95. }
  96. }
  97. }
  98. }
  99. // 拖拽事件(从工具栏拖拽绘制)
  100. if (event->type() == QEvent::DragEnter)
  101. {
  102. QDragEnterEvent *dragEvent = static_cast<QDragEnterEvent*>(event);
  103. dragEvent->acceptProposedAction();
  104. return true;
  105. }
  106. if (event->type() == QEvent::DragMove)
  107. {
  108. static_cast<QDragMoveEvent*>(event)->acceptProposedAction();
  109. return true;
  110. }
  111. if (event->type() == QEvent::Drop)
  112. {
  113. QDropEvent *dropEvent = static_cast<QDropEvent*>(event);
  114. const QMimeData *mimeData = dropEvent->mimeData();
  115. QPointF scenePos = m_view->mapToScene(dropEvent->pos());
  116. // 使用QMimeData
  117. if (mimeData && mimeData->hasText())
  118. {
  119. createShape(mimeData->text(), scenePos);
  120. resetDrawFlags();//重置防止拖拽后再次点击生成
  121. }
  122. dropEvent->acceptProposedAction();
  123. return true;
  124. }
  125. return QWidget::eventFilter(obj, event);
  126. }
  127. void HMIDocument::createShape(const QString& type, const QPointF &pos)
  128. {
  129. m_scene->clearSelection();
  130. if (type == "指示灯" || type == "ellipse")
  131. {
  132. ResizableEllipse *ellipse = new ResizableEllipse(pos.x(), pos.y(), 50, 50);
  133. ellipse->setBrush(QBrush(Qt::red));
  134. ellipse->setPen(QPen(Qt::black, 1));
  135. m_scene->addItem(ellipse);
  136. ellipse->setSelected(true);
  137. }
  138. else if (type == "按钮" || type == "rectangle")
  139. {
  140. ResizableRectangle *rect = new ResizableRectangle(pos.x(), pos.y(), 100, 50);
  141. rect->setBrush(QBrush(Qt::yellow));
  142. rect->setPen(QPen(Qt::black, 1));
  143. m_scene->addItem(rect);
  144. rect->setSelected(true);
  145. }
  146. setModified(true);
  147. }
  148. // 重置绘制标志
  149. void HMIDocument::resetDrawFlags()
  150. {
  151. m_canDrawEllipse = false;
  152. m_canDrawRectangle = false;
  153. }
  154. // 右键菜单
  155. void HMIDocument::showContextMenu(QPoint globalPos)
  156. {
  157. QPoint viewportPos = m_view->mapFromGlobal(globalPos);
  158. QPointF scenePos = m_view->mapToScene(viewportPos);
  159. QGraphicsItem *clickedItem = m_scene->itemAt(scenePos, m_view->transform());
  160. QMenu menu(this);
  161. if (!clickedItem)
  162. {
  163. // 空白区域:仅显示粘贴
  164. QAction *pasteAction = menu.addAction("粘贴");
  165. pasteAction->setEnabled(!m_copiedItemsData.isEmpty());
  166. connect(pasteAction, &QAction::triggered, this, &HMIDocument::pasteItems);
  167. }
  168. else
  169. {
  170. // 选中图形:显示完整菜单
  171. QAction *propAction = menu.addAction("属性");
  172. QAction *copyAction = menu.addAction("复制");
  173. QAction *pasteAction = menu.addAction("粘贴");
  174. QAction *deleteAction = menu.addAction("删除");
  175. QAction *onAction = menu.addAction("置为ON");
  176. QAction *offAction = menu.addAction("置为OFF");
  177. pasteAction->setEnabled(!m_copiedItemsData.isEmpty());
  178. connect(propAction, &QAction::triggered, this, &HMIDocument::showItemProperties);
  179. connect(copyAction, &QAction::triggered, this, &HMIDocument::copySelectedItems);
  180. connect(pasteAction, &QAction::triggered, this, &HMIDocument::pasteItems);
  181. connect(deleteAction, &QAction::triggered, this, &HMIDocument::deleteSelectedItems);
  182. // ON/OFF动作(针对指示灯和按钮)
  183. connect(onAction, &QAction::triggered, [=]() {
  184. if (auto ellipse = dynamic_cast<ResizableEllipse*>(clickedItem)) {
  185. ellipse->setBrush(ellipse->onColor());
  186. } else if (auto rect = dynamic_cast<ResizableRectangle*>(clickedItem)) {
  187. rect->setBrush(rect->pressedColor());
  188. }
  189. });
  190. connect(offAction, &QAction::triggered, [=]() {
  191. if (auto ellipse = dynamic_cast<ResizableEllipse*>(clickedItem)) {
  192. ellipse->setBrush(ellipse->offColor());
  193. } else if (auto rect = dynamic_cast<ResizableRectangle*>(clickedItem)) {
  194. rect->setBrush(rect->releasedColor());
  195. }
  196. });
  197. }
  198. menu.exec(globalPos + QPoint(10, 10));
  199. }
  200. // 复制选中项
  201. void HMIDocument::copySelectedItems()
  202. {
  203. m_copiedItemsData.clear();
  204. QList<QGraphicsItem*> selectedItems = m_scene->selectedItems();
  205. if (selectedItems.isEmpty()) return;
  206. foreach (QGraphicsItem *item, selectedItems)
  207. {
  208. m_copiedItemsData.append(serializeItem(item));
  209. }
  210. m_lastPastePos = selectedItems.first()->pos();
  211. setModified(true);
  212. }
  213. // 粘贴项
  214. void HMIDocument::pasteItems()
  215. {
  216. if (m_copiedItemsData.isEmpty()) return;
  217. QPointF offset(20, 20);
  218. m_lastPastePos += offset;
  219. m_scene->clearSelection();
  220. foreach (const QByteArray &itemData, m_copiedItemsData)
  221. {
  222. QGraphicsItem *newItem = deserializeItem(itemData);
  223. if (newItem)
  224. {
  225. m_scene->addItem(newItem);
  226. newItem->setPos(m_lastPastePos);
  227. newItem->setSelected(true);
  228. }
  229. }
  230. setModified(true);
  231. }
  232. // 删除选中项
  233. void HMIDocument::deleteSelectedItems()
  234. {
  235. QList<QGraphicsItem*> selectedItems = m_scene->selectedItems();
  236. foreach (QGraphicsItem *item, selectedItems) {
  237. m_scene->removeItem(item);
  238. delete item;
  239. }
  240. setModified(true);
  241. }
  242. // 显示属性对话框
  243. void HMIDocument::showItemProperties()
  244. {
  245. QList<QGraphicsItem*> selectedItems = m_scene->selectedItems();
  246. if (selectedItems.isEmpty()) return;
  247. QGraphicsItem *item = selectedItems.first();
  248. // 将QGraphicsItem转换为NamedItem
  249. NamedItem *namedItem = dynamic_cast<NamedItem*>(item);
  250. if (!namedItem) return;
  251. QDialog dialog(this);
  252. dialog.setWindowTitle("属性设置");
  253. QFormLayout *form = new QFormLayout(&dialog);
  254. // 名称输入 - 使用NamedItem接口
  255. QLineEdit *nameEdit = new QLineEdit(namedItem->name());
  256. // 颜色选择(根据图形类型)
  257. QColor tempColor1, tempColor2;
  258. QPushButton *colorBtn1 = new QPushButton;
  259. QPushButton *colorBtn2 = new QPushButton;
  260. if (auto ellipse = dynamic_cast<ResizableEllipse*>(item)) {
  261. tempColor1 = ellipse->onColor();
  262. tempColor2 = ellipse->offColor();
  263. form->addRow("ON颜色:", colorBtn1);
  264. form->addRow("OFF颜色:", colorBtn2);
  265. } else if (auto rect = dynamic_cast<ResizableRectangle*>(item)) {
  266. tempColor1 = rect->pressedColor();
  267. tempColor2 = rect->releasedColor();
  268. form->addRow("按下颜色:", colorBtn1);
  269. form->addRow("释放颜色:", colorBtn2);
  270. }
  271. // 初始化颜色按钮
  272. colorBtn1->setStyleSheet("background-color:" + tempColor1.name());
  273. colorBtn2->setStyleSheet("background-color:" + tempColor2.name());
  274. // 颜色选择对话框
  275. connect(colorBtn1, &QPushButton::clicked, [&]() {
  276. QColor c = QColorDialog::getColor(tempColor1, &dialog);
  277. if (c.isValid()) {
  278. tempColor1 = c;
  279. colorBtn1->setStyleSheet("background-color:" + c.name());
  280. }
  281. });
  282. connect(colorBtn2, &QPushButton::clicked, [&]() {
  283. QColor c = QColorDialog::getColor(tempColor2, &dialog);
  284. if (c.isValid()) {
  285. tempColor2 = c;
  286. colorBtn2->setStyleSheet("background-color:" + c.name());
  287. }
  288. });
  289. // 布局组装
  290. form->addRow("对象:", nameEdit);
  291. QDialogButtonBox *btnBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
  292. form->addRow(btnBox);
  293. connect(btnBox, &QDialogButtonBox::accepted, &dialog, &QDialog::accept);
  294. connect(btnBox, &QDialogButtonBox::rejected, &dialog, &QDialog::reject);
  295. // 应用属性
  296. if (dialog.exec() == QDialog::Accepted) {
  297. setModified(true);
  298. // 使用NamedItem接口设置名称
  299. namedItem->setName(nameEdit->text());
  300. if (auto ellipse = dynamic_cast<ResizableEllipse*>(item)) {
  301. ellipse->setOnColor(tempColor1);
  302. ellipse->setOffColor(tempColor2);
  303. } else if (auto rect = dynamic_cast<ResizableRectangle*>(item)) {
  304. rect->setPressedColor(tempColor1);
  305. rect->setReleasedColor(tempColor2);
  306. }
  307. item->update();
  308. }
  309. }
  310. // 序列化图形项(用于复制粘贴)
  311. QByteArray HMIDocument::serializeItem(QGraphicsItem *item)
  312. {
  313. QByteArray data;
  314. QDataStream stream(&data, QIODevice::WriteOnly);
  315. // 基础信息
  316. stream << item->type();
  317. stream << item->pos();
  318. stream << item->flags();
  319. stream << item->transform();
  320. stream << item->isVisible();
  321. // 形状信息
  322. if (auto shape = dynamic_cast<QAbstractGraphicsShapeItem*>(item))
  323. {
  324. stream << shape->pen();
  325. stream << shape->brush();
  326. stream << shape->boundingRect();
  327. }
  328. // 具体图形信息
  329. if (auto rect = dynamic_cast<ResizableRectangle*>(item))
  330. {
  331. stream << rect->rect();
  332. stream << rect->pressedColor();
  333. stream << rect->releasedColor();
  334. stream << rect->name();
  335. } else if (auto ellipse = dynamic_cast<ResizableEllipse*>(item))
  336. {
  337. stream << ellipse->rect();
  338. stream << ellipse->onColor();
  339. stream << ellipse->offColor();
  340. stream << ellipse->name();
  341. }
  342. return data;
  343. }
  344. // 反序列化图形项(用于粘贴)
  345. QGraphicsItem *HMIDocument::deserializeItem(const QByteArray &data)
  346. {
  347. QDataStream stream(data);
  348. int type;
  349. QPointF pos;
  350. QGraphicsItem::GraphicsItemFlags flags;
  351. QTransform transform;
  352. bool visible;
  353. stream >> type >> pos >> flags >> transform >> visible;
  354. QGraphicsItem *item = nullptr;
  355. if (type == QGraphicsRectItem::Type) {
  356. QPen pen;
  357. QBrush brush;
  358. QRectF boundRect;
  359. QRectF rect;
  360. QColor pressedColor, releasedColor;
  361. QString name;
  362. stream >> pen >> brush >> boundRect >> rect >> pressedColor >> releasedColor >> name;
  363. ResizableRectangle *rectItem = new ResizableRectangle(0, 0, rect.width(), rect.height());
  364. rectItem->setPen(pen);
  365. rectItem->setBrush(brush);
  366. rectItem->setPressedColor(pressedColor);
  367. rectItem->setReleasedColor(releasedColor);
  368. rectItem->setName(name);
  369. item = rectItem;
  370. } else if (type == QGraphicsEllipseItem::Type) {
  371. QPen pen;
  372. QBrush brush;
  373. QRectF boundRect;
  374. QRectF rect;
  375. QColor onColor, offColor;
  376. QString name;
  377. stream >> pen >> brush >> boundRect >> rect >> onColor >> offColor >> name;
  378. ResizableEllipse *ellipseItem = new ResizableEllipse(0, 0, rect.width(), rect.height());
  379. ellipseItem->setPen(pen);
  380. ellipseItem->setBrush(brush);
  381. ellipseItem->setOnColor(onColor);
  382. ellipseItem->setOffColor(offColor);
  383. ellipseItem->setName(name);
  384. item = ellipseItem;
  385. }
  386. if (item) {
  387. item->setFlags(flags);
  388. item->setTransform(transform);
  389. item->setVisible(visible);
  390. }
  391. return item;
  392. }
  393. void HMIDocument::startDrawingEllipse()
  394. {
  395. m_canDrawEllipse = true;
  396. m_canDrawRectangle = false;
  397. }
  398. void HMIDocument::startDrawingRectangle()
  399. {
  400. m_canDrawEllipse = false;
  401. m_canDrawRectangle = true;
  402. }
  403. bool HMIDocument::saveToFile(const QString &filePath)
  404. {
  405. QFile file(filePath);
  406. if (!file.open(QIODevice::WriteOnly)) {
  407. qWarning() << "无法打开文件进行写入:" << filePath;
  408. return false;
  409. }
  410. // 创建JSON文档结构
  411. QJsonObject docObject;
  412. docObject["title"] = m_title;
  413. docObject["sceneRect"] = QJsonArray({
  414. m_scene->sceneRect().x(),
  415. m_scene->sceneRect().y(),
  416. m_scene->sceneRect().width(),
  417. m_scene->sceneRect().height()
  418. });
  419. docObject["backgroundColor"] = m_scene->backgroundBrush().color().name();
  420. // 序列化所有图形项
  421. QJsonArray itemsArray;
  422. foreach (QGraphicsItem *item, m_scene->items()) {
  423. QJsonObject itemJson = itemToJson(item);
  424. if (!itemJson.isEmpty()) {
  425. itemsArray.append(itemJson);
  426. }
  427. }
  428. docObject["items"] = itemsArray;
  429. // 写入文件
  430. QJsonDocument doc(docObject);
  431. file.write(doc.toJson());
  432. file.close();
  433. // 更新文档状态
  434. setFilePath(filePath);
  435. setModified(false);
  436. QFileInfo fileInfo(filePath);
  437. setTitle(fileInfo.baseName());
  438. return true;
  439. }
  440. // 从文件加载文档
  441. bool HMIDocument::loadFromFile(const QString &filePath)
  442. {
  443. QFile file(filePath);
  444. if (!file.open(QIODevice::ReadOnly)) {
  445. qWarning() << "无法打开文件进行读取:" << filePath;
  446. return false;
  447. }
  448. // 读取JSON文档
  449. QByteArray data = file.readAll();
  450. QJsonDocument doc = QJsonDocument::fromJson(data);
  451. if (doc.isNull()) {
  452. qWarning() << "无效的JSON文档:" << filePath;
  453. return false;
  454. }
  455. // 解析文档
  456. QJsonObject docObject = doc.object();
  457. m_title = docObject["title"].toString();
  458. // 设置场景属性
  459. QJsonArray sceneRectArray = docObject["sceneRect"].toArray();
  460. if (sceneRectArray.size() == 4) {
  461. QRectF sceneRect(
  462. sceneRectArray[0].toDouble(),
  463. sceneRectArray[1].toDouble(),
  464. sceneRectArray[2].toDouble(),
  465. sceneRectArray[3].toDouble()
  466. );
  467. m_scene->setSceneRect(sceneRect);
  468. }
  469. if (docObject.contains("backgroundColor")) {
  470. QColor bgColor(docObject["backgroundColor"].toString());
  471. m_scene->setBackgroundBrush(QBrush(bgColor));
  472. }
  473. // 清除现有内容
  474. m_scene->clear();
  475. // 加载所有图形项
  476. QJsonArray itemsArray = docObject["items"].toArray();
  477. foreach (QJsonValue itemValue, itemsArray) {
  478. QJsonObject itemJson = itemValue.toObject();
  479. QGraphicsItem *item = jsonToItem(itemJson);
  480. if (item) {
  481. m_scene->addItem(item);
  482. }
  483. }
  484. // 更新文档状态
  485. setFilePath(filePath);
  486. setModified(false);
  487. return true;
  488. }
  489. // 将图形项转换为JSON对象
  490. QJsonObject HMIDocument::itemToJson(QGraphicsItem *item)
  491. {
  492. QJsonObject json;
  493. // 基础属性
  494. json["type"] = item->type();
  495. json["x"] = item->x();
  496. json["y"] = item->y();
  497. json["zValue"] = item->zValue();
  498. json["visible"] = item->isVisible();
  499. // 具体图形项属性
  500. if (auto ellipse = dynamic_cast<ResizableEllipse*>(item)) {
  501. json["itemType"] = "ellipse";
  502. json["rect"] = QJsonArray({
  503. ellipse->rect().x(),
  504. ellipse->rect().y(),
  505. ellipse->rect().width(),
  506. ellipse->rect().height()
  507. });
  508. json["onColor"] = ellipse->onColor().name();
  509. json["offColor"] = ellipse->offColor().name();
  510. json["currentColor"] = ellipse->brush().color().name();
  511. json["penColor"] = ellipse->pen().color().name();
  512. json["penWidth"] = ellipse->pen().width();
  513. json["name"] = ellipse->name();
  514. }
  515. else if (auto rect = dynamic_cast<ResizableRectangle*>(item)) {
  516. json["itemType"] = "rectangle";
  517. json["rect"] = QJsonArray({
  518. rect->rect().x(),
  519. rect->rect().y(),
  520. rect->rect().width(),
  521. rect->rect().height()
  522. });
  523. json["pressedColor"] = rect->pressedColor().name();
  524. json["releasedColor"] = rect->releasedColor().name();
  525. json["currentColor"] = rect->brush().color().name();
  526. json["penColor"] = rect->pen().color().name();
  527. json["penWidth"] = rect->pen().width();
  528. json["name"] = rect->name();
  529. }
  530. return json;
  531. }
  532. // 从JSON对象创建图形项
  533. QGraphicsItem *HMIDocument::jsonToItem(const QJsonObject &json)
  534. {
  535. QString itemType = json["itemType"].toString();
  536. QGraphicsItem *item = nullptr;
  537. if (itemType == "ellipse") {
  538. QJsonArray rectArray = json["rect"].toArray();
  539. if (rectArray.size() != 4) return nullptr;
  540. ResizableEllipse *ellipse = new ResizableEllipse(
  541. rectArray[0].toDouble(),
  542. rectArray[1].toDouble(),
  543. rectArray[2].toDouble(),
  544. rectArray[3].toDouble()
  545. );
  546. ellipse->setOnColor(QColor(json["onColor"].toString()));
  547. ellipse->setOffColor(QColor(json["offColor"].toString()));
  548. ellipse->setBrush(QColor(json["currentColor"].toString()));
  549. ellipse->setPen(QPen(
  550. QColor(json["penColor"].toString()),
  551. json["penWidth"].toDouble()
  552. ));
  553. ellipse->setName(json["name"].toString());
  554. item = ellipse;
  555. }
  556. else if (itemType == "rectangle") {
  557. QJsonArray rectArray = json["rect"].toArray();
  558. if (rectArray.size() != 4) return nullptr;
  559. ResizableRectangle *rect = new ResizableRectangle(
  560. rectArray[0].toDouble(),
  561. rectArray[1].toDouble(),
  562. rectArray[2].toDouble(),
  563. rectArray[3].toDouble()
  564. );
  565. rect->setPressedColor(QColor(json["pressedColor"].toString()));
  566. rect->setReleasedColor(QColor(json["releasedColor"].toString()));
  567. rect->setBrush(QColor(json["currentColor"].toString()));
  568. rect->setPen(QPen(
  569. QColor(json["penColor"].toString()),
  570. json["penWidth"].toDouble()
  571. ));
  572. rect->setName(json["name"].toString());
  573. item = rect;
  574. }
  575. // 设置基础属性
  576. if (item) {
  577. item->setX(json["x"].toDouble());
  578. item->setY(json["y"].toDouble());
  579. item->setZValue(json["zValue"].toDouble());
  580. item->setVisible(json["visible"].toBool());
  581. }
  582. return item;
  583. }
  584. QString HMIDocument::title() const { return m_title; }
  585. void HMIDocument::setTitle(const QString &title) { m_title = title; }
  586. QGraphicsView *HMIDocument::view() const { return m_view; }
  587. QGraphicsScene *HMIDocument::scene() const { return m_scene; }
  588. void HMIDocument::setDrawEllipse(bool enable) { m_canDrawEllipse = enable; }
  589. void HMIDocument::setDrawRectangle(bool enable) { m_canDrawRectangle = enable; }
  590. void HMIDocument::markModified() { setModified(true); }