Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

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