123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 |
- #include "WindowAppPouView.h"
- #include "WindowAppPouScene.h"
- #include "DragMimeData.h"
- #include "WindowAppTreeTool.h"
- #include "WindowAppPouFrame.h"
- #include "VPCommand.h"
- #include "Pou.h"
- WindowAppPouView::WindowAppPouView(QWidget* parent /*= nullptr*/)
- : QGraphicsView()
- , m_pPouScene(nullptr)
- {
- this->setParent(parent);
- this->m_fZoom = 0;
- this->m_pBkImage = nullptr;
- }
- /// <summary>
- /// 初始化
- /// </summary>
- void WindowAppPouView::initView(const QString& strGroup, QWidget* pParent)
- {
- // 设置为可接收拖拽
- this->setAcceptDrops(true);
- //// 设置视图的重绘方式(默认也是这种方式)
- //this->setViewportUpdateMode(QGraphicsView::MinimalViewportUpdate);
- // 取消滚动条
- //this->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
- //this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
- // 绘图窗口的场景类
- // 2022-1-8 修改,此处将父控件WindowAppPouView*传递给Scene,用于实现点击调用函数
- m_pPouScene = new WindowAppPouScene(strGroup, this, pParent);
- // 设置为固定大小
- // 将自身设置得比scene略大,防止出现滚动条
- this->resize(POU_VIEW_WIDTH + 1, POU_VIEW_HEIGHT + 1);
- m_pPouScene->setSceneRect(QRectF(0, 0, POU_VIEW_WIDTH, POU_VIEW_HEIGHT));
- this->setScene(m_pPouScene);
- // 由于默认是居中显示,此处需要设置为默认左上角显示
- this->centerOn(0, 0);
- // 防止窗口中的对象拖尾
- this->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
- // 初始化方格背景
- this->initBkImage();
- //设置橡皮筋选择选项
- this->setDragMode(QGraphicsView::RubberBandDrag);
- // 设置抗锯齿(解决link 拖拽的时候,预览线有锯齿)
- this->setRenderHint(QPainter::Antialiasing, true);
- // 初始化与Zoom相关操作
- this->initZoom();
- }
- /// <summary>
- /// 初始化与缩放相关的操作
- /// </summary>
- void WindowAppPouView::initZoom()
- {
- //用于缩放视图的滑动条
- QSlider* slider = new QSlider;
- slider->setOrientation(Qt::Horizontal);
- slider->setRange(1, 100);
- slider->setTickInterval(10);
- slider->setValue(50);
- slider->setMaximumSize(80, 20);
- connect(slider, SIGNAL(valueChanged(int)), this, SLOT(slotZoom(int)));
- QGridLayout* gridLayout = new QGridLayout(this);
- QSpacerItem* horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
- gridLayout->addItem(horizontalSpacer, 1, 0, 1, 1);
- QSpacerItem* verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding);
- gridLayout->addItem(verticalSpacer, 0, 0, 1, 1);
- m_pZooomLabel = new QLabel();
- m_pZooomLabel->setText("Zoom 0 ");
- gridLayout->addWidget(slider, 1, 1, 1, 1);
- gridLayout->addWidget(m_pZooomLabel, 1, 2, 1, 1);
- setLayout(gridLayout);
- m_fZoom = 50;
- connect(horizontalScrollBar(), &QScrollBar::valueChanged, this, &WindowAppPouView::viewportRectChanged);
- connect(verticalScrollBar(), &QScrollBar::valueChanged, this, &WindowAppPouView::viewportRectChanged);
- }
- //
- //#include "LoadingManager.h"
- //void myFunction()
- //{
- // Utility::qSleep(10000);
- //
- // qDebug() << "myFunction finished";
- //
- // emit g_pLoadingManager->sigLoadingFinished();
- //}
- /// <summary>
- /// 在拖拽事件中获取拖动进来的工具信息
- /// </summary>
- /// <param name="event"></param>
- void WindowAppPouView::dropEvent(QDropEvent* event)
- {
- // 确定是从树形控件拖拽来的
- WindowAppTreeTool* source = qobject_cast<WindowAppTreeTool*>(event->source());
- if (source)
- {
- const DragMimeData* pMimeData = (const DragMimeData*)(event->mimeData());
- // 确认MimeData中有对应的数据字段
- if (pMimeData->hasFormat(FORMAT_DRAG_TOOL))
- {
- // 取出拖动的工具信息
- const STATIC_TOOL* pDragTool = pMimeData->DragItemData();
- // 2021/4/17 处理了一个拖动tool为空的bug
- if (pDragTool == nullptr)
- {
- return;
- }
- //// 取出节点信息
- //qDebug() << pDragTool->strName;
- qDebug() << "[TOOL] Drag " << pDragTool->strName << " to WindowAppDiagramView.";
- // 按照拖动的工具信息在Pou中进行创建对应的运行时工具
- // ((WindowAppPouScene*)this->scene())->addNewItem(pDragTool, mapToScene( event->pos()));
- // 2022-10-1,将Pou工具的添加整合进Undo体系
- PouToolAddCommand* toolAddCommand = new PouToolAddCommand((WindowAppPouScene*)this->scene(), pDragTool, mapToScene(event->pos()));
- ((WindowAppPouScene*)scene())->m_CommandManager.executeCommand(toolAddCommand);
- //emit g_pLoadingManager->sigLoading();
- //QFuture<void> future = QtConcurrent::run(myFunction);
- //while (true)
- //{
- // QCoreApplication::processEvents();
- // if (future.isFinished())
- // {
- // break;
- // }
- // Utility::qSleep(100);
- //}
- //emit g_pLoadingManager->sigLoadingFinished();
- }
- event->accept();
- }
- }
- /// <summary>
- /// 拖拽动作处理
- /// </summary>
- /// <param name="event"></param>
- void WindowAppPouView::dragMoveEvent(QDragMoveEvent* event)
- {
- // 只接收从toolTree的拖动操作
- WindowAppTreeTool* source = qobject_cast<WindowAppTreeTool*> (event->source());
- if (source)
- {
- event->acceptProposedAction();
- event->accept();
- }
- }
- ///// <summary>
- ///// 直接添加Tool功能块(from序列化文件)
- ///// </summary>
- ///// <param name="newTool"></param>
- //void WindowAppPouView::addToolDirectly(TOOL* newTool, QPointF pos)
- //{
- // ((WindowAppPouScene*)this->scene())->addNewItem(newTool, pos, true);
- //}
- ///// <summary>
- ///// 在界面中添加新的Link(from序列化文件)
- ///// </summary>
- ///// <param name="strStartInf"></param>
- ///// <param name="strEndInf"></param>
- //void WindowAppPouView::addLinkDirectly(const QString& strStartInf, const QString& strEndInf, LINK_MODE linkMode)
- //{
- // ((WindowAppPouScene*)this->scene())->addLink(strStartInf, strEndInf, linkMode);
- //}
- /// <summary>
- /// 在界面中添加棋盘格背景
- /// </summary>
- /// <param name="painter"></param>
- /// <param name="rect"></param>
- void WindowAppPouView::drawBackground(QPainter* painter, const QRectF& rect)
- {
- if (m_pBkImage)
- {
- painter->drawTiledPixmap(rect, *m_pBkImage);
- }
- }
- /// <summary>
- /// 自动缩放
- /// </summary>
- /// <param name="resizeEvent"></param>
- void WindowAppPouView::resizeEvent(QResizeEvent* resizeEvent)
- {
- Q_UNUSED(resizeEvent);
- //QRect rect = this->geometry();
- //m_pDiagramScene->setSceneRect(0, 0, rect.width(), rect.height());
- emit navigatorViewRequired(true, transform());
- }
- void WindowAppPouView::slotZoom(int value)
- {
- qreal scaleFactor;
- if (value > m_fZoom)//放大
- {
- scaleFactor = pow(1.05, (value - m_fZoom));
- }
- else {
- scaleFactor = pow(1 / 1.05, (m_fZoom - value));
- }
- scale(scaleFactor, scaleFactor);
- m_fZoom = value;
- QString strZoom = "Zoom " + QString::number(value - 50) + " ";
- m_pZooomLabel->setText(strZoom);
- emit navigatorViewRequired(true , transform());
- }
- /// <summary>
- /// 初始化方格背景
- /// </summary>
- void WindowAppPouView::initBkImage()
- {
- m_pBkImage = new QPixmap(16, 16);
- QColor color1(60, 60, 60);
- QColor color2(45, 45, 45);
- m_pBkImage->fill(color1);
- QPainter painter1(m_pBkImage);
- painter1.fillRect(0, 0, 8, 8, color2);
- painter1.fillRect(8, 8, 8, 8, color2);
- painter1.end();
- }
|