WindowAppPouView.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. #include "WindowAppPouView.h"
  2. #include "WindowAppPouScene.h"
  3. #include "DragMimeData.h"
  4. #include "WindowAppTreeTool.h"
  5. #include "WindowAppPouFrame.h"
  6. #include "VPCommand.h"
  7. #include "Pou.h"
  8. WindowAppPouView::WindowAppPouView(QWidget* parent /*= nullptr*/)
  9. : QGraphicsView()
  10. , m_pPouScene(nullptr)
  11. {
  12. this->setParent(parent);
  13. this->m_fZoom = 0;
  14. this->m_pBkImage = nullptr;
  15. }
  16. /// <summary>
  17. /// 初始化
  18. /// </summary>
  19. void WindowAppPouView::initView(const QString& strGroup, QWidget* pParent)
  20. {
  21. // 设置为可接收拖拽
  22. this->setAcceptDrops(true);
  23. //// 设置视图的重绘方式(默认也是这种方式)
  24. //this->setViewportUpdateMode(QGraphicsView::MinimalViewportUpdate);
  25. // 取消滚动条
  26. //this->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
  27. //this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
  28. // 绘图窗口的场景类
  29. // 2022-1-8 修改,此处将父控件WindowAppPouView*传递给Scene,用于实现点击调用函数
  30. m_pPouScene = new WindowAppPouScene(strGroup, this, pParent);
  31. // 设置为固定大小
  32. // 将自身设置得比scene略大,防止出现滚动条
  33. this->resize(POU_VIEW_WIDTH + 1, POU_VIEW_HEIGHT + 1);
  34. m_pPouScene->setSceneRect(QRectF(0, 0, POU_VIEW_WIDTH, POU_VIEW_HEIGHT));
  35. this->setScene(m_pPouScene);
  36. // 由于默认是居中显示,此处需要设置为默认左上角显示
  37. this->centerOn(0, 0);
  38. // 防止窗口中的对象拖尾
  39. this->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
  40. // 初始化方格背景
  41. this->initBkImage();
  42. //设置橡皮筋选择选项
  43. this->setDragMode(QGraphicsView::RubberBandDrag);
  44. // 设置抗锯齿(解决link 拖拽的时候,预览线有锯齿)
  45. this->setRenderHint(QPainter::Antialiasing, true);
  46. // 初始化与Zoom相关操作
  47. this->initZoom();
  48. }
  49. /// <summary>
  50. /// 初始化与缩放相关的操作
  51. /// </summary>
  52. void WindowAppPouView::initZoom()
  53. {
  54. //用于缩放视图的滑动条
  55. QSlider* slider = new QSlider;
  56. slider->setOrientation(Qt::Horizontal);
  57. slider->setRange(1, 100);
  58. slider->setTickInterval(10);
  59. slider->setValue(50);
  60. slider->setMaximumSize(80, 20);
  61. connect(slider, SIGNAL(valueChanged(int)), this, SLOT(slotZoom(int)));
  62. QGridLayout* gridLayout = new QGridLayout(this);
  63. QSpacerItem* horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
  64. gridLayout->addItem(horizontalSpacer, 1, 0, 1, 1);
  65. QSpacerItem* verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding);
  66. gridLayout->addItem(verticalSpacer, 0, 0, 1, 1);
  67. m_pZooomLabel = new QLabel();
  68. m_pZooomLabel->setText("Zoom 0 ");
  69. gridLayout->addWidget(slider, 1, 1, 1, 1);
  70. gridLayout->addWidget(m_pZooomLabel, 1, 2, 1, 1);
  71. setLayout(gridLayout);
  72. m_fZoom = 50;
  73. connect(horizontalScrollBar(), &QScrollBar::valueChanged, this, &WindowAppPouView::viewportRectChanged);
  74. connect(verticalScrollBar(), &QScrollBar::valueChanged, this, &WindowAppPouView::viewportRectChanged);
  75. }
  76. //
  77. //#include "LoadingManager.h"
  78. //void myFunction()
  79. //{
  80. // Utility::qSleep(10000);
  81. //
  82. // qDebug() << "myFunction finished";
  83. //
  84. // emit g_pLoadingManager->sigLoadingFinished();
  85. //}
  86. /// <summary>
  87. /// 在拖拽事件中获取拖动进来的工具信息
  88. /// </summary>
  89. /// <param name="event"></param>
  90. void WindowAppPouView::dropEvent(QDropEvent* event)
  91. {
  92. // 确定是从树形控件拖拽来的
  93. WindowAppTreeTool* source = qobject_cast<WindowAppTreeTool*>(event->source());
  94. if (source)
  95. {
  96. const DragMimeData* pMimeData = (const DragMimeData*)(event->mimeData());
  97. // 确认MimeData中有对应的数据字段
  98. if (pMimeData->hasFormat(FORMAT_DRAG_TOOL))
  99. {
  100. // 取出拖动的工具信息
  101. const STATIC_TOOL* pDragTool = pMimeData->DragItemData();
  102. // 2021/4/17 处理了一个拖动tool为空的bug
  103. if (pDragTool == nullptr)
  104. {
  105. return;
  106. }
  107. //// 取出节点信息
  108. //qDebug() << pDragTool->strName;
  109. qDebug() << "[TOOL] Drag " << pDragTool->strName << " to WindowAppDiagramView.";
  110. // 按照拖动的工具信息在Pou中进行创建对应的运行时工具
  111. // ((WindowAppPouScene*)this->scene())->addNewItem(pDragTool, mapToScene( event->pos()));
  112. // 2022-10-1,将Pou工具的添加整合进Undo体系
  113. PouToolAddCommand* toolAddCommand = new PouToolAddCommand((WindowAppPouScene*)this->scene(), pDragTool, mapToScene(event->pos()));
  114. ((WindowAppPouScene*)scene())->m_CommandManager.executeCommand(toolAddCommand);
  115. //emit g_pLoadingManager->sigLoading();
  116. //QFuture<void> future = QtConcurrent::run(myFunction);
  117. //while (true)
  118. //{
  119. // QCoreApplication::processEvents();
  120. // if (future.isFinished())
  121. // {
  122. // break;
  123. // }
  124. // Utility::qSleep(100);
  125. //}
  126. //emit g_pLoadingManager->sigLoadingFinished();
  127. }
  128. event->accept();
  129. }
  130. }
  131. /// <summary>
  132. /// 拖拽动作处理
  133. /// </summary>
  134. /// <param name="event"></param>
  135. void WindowAppPouView::dragMoveEvent(QDragMoveEvent* event)
  136. {
  137. // 只接收从toolTree的拖动操作
  138. WindowAppTreeTool* source = qobject_cast<WindowAppTreeTool*> (event->source());
  139. if (source)
  140. {
  141. event->acceptProposedAction();
  142. event->accept();
  143. }
  144. }
  145. ///// <summary>
  146. ///// 直接添加Tool功能块(from序列化文件)
  147. ///// </summary>
  148. ///// <param name="newTool"></param>
  149. //void WindowAppPouView::addToolDirectly(TOOL* newTool, QPointF pos)
  150. //{
  151. // ((WindowAppPouScene*)this->scene())->addNewItem(newTool, pos, true);
  152. //}
  153. ///// <summary>
  154. ///// 在界面中添加新的Link(from序列化文件)
  155. ///// </summary>
  156. ///// <param name="strStartInf"></param>
  157. ///// <param name="strEndInf"></param>
  158. //void WindowAppPouView::addLinkDirectly(const QString& strStartInf, const QString& strEndInf, LINK_MODE linkMode)
  159. //{
  160. // ((WindowAppPouScene*)this->scene())->addLink(strStartInf, strEndInf, linkMode);
  161. //}
  162. /// <summary>
  163. /// 在界面中添加棋盘格背景
  164. /// </summary>
  165. /// <param name="painter"></param>
  166. /// <param name="rect"></param>
  167. void WindowAppPouView::drawBackground(QPainter* painter, const QRectF& rect)
  168. {
  169. if (m_pBkImage)
  170. {
  171. painter->drawTiledPixmap(rect, *m_pBkImage);
  172. }
  173. }
  174. /// <summary>
  175. /// 自动缩放
  176. /// </summary>
  177. /// <param name="resizeEvent"></param>
  178. void WindowAppPouView::resizeEvent(QResizeEvent* resizeEvent)
  179. {
  180. Q_UNUSED(resizeEvent);
  181. //QRect rect = this->geometry();
  182. //m_pDiagramScene->setSceneRect(0, 0, rect.width(), rect.height());
  183. emit navigatorViewRequired(true, transform());
  184. }
  185. void WindowAppPouView::slotZoom(int value)
  186. {
  187. qreal scaleFactor;
  188. if (value > m_fZoom)//放大
  189. {
  190. scaleFactor = pow(1.05, (value - m_fZoom));
  191. }
  192. else {
  193. scaleFactor = pow(1 / 1.05, (m_fZoom - value));
  194. }
  195. scale(scaleFactor, scaleFactor);
  196. m_fZoom = value;
  197. QString strZoom = "Zoom " + QString::number(value - 50) + " ";
  198. m_pZooomLabel->setText(strZoom);
  199. emit navigatorViewRequired(true , transform());
  200. }
  201. /// <summary>
  202. /// 初始化方格背景
  203. /// </summary>
  204. void WindowAppPouView::initBkImage()
  205. {
  206. m_pBkImage = new QPixmap(16, 16);
  207. QColor color1(60, 60, 60);
  208. QColor color2(45, 45, 45);
  209. m_pBkImage->fill(color1);
  210. QPainter painter1(m_pBkImage);
  211. painter1.fillRect(0, 0, 8, 8, color2);
  212. painter1.fillRect(8, 8, 8, 8, color2);
  213. painter1.end();
  214. }