#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; } /// /// 初始化 /// 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(); } /// /// 初始化与缩放相关的操作 /// 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(); //} /// /// 在拖拽事件中获取拖动进来的工具信息 /// /// void WindowAppPouView::dropEvent(QDropEvent* event) { // 确定是从树形控件拖拽来的 WindowAppTreeTool* source = qobject_cast(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 future = QtConcurrent::run(myFunction); //while (true) //{ // QCoreApplication::processEvents(); // if (future.isFinished()) // { // break; // } // Utility::qSleep(100); //} //emit g_pLoadingManager->sigLoadingFinished(); } event->accept(); } } /// /// 拖拽动作处理 /// /// void WindowAppPouView::dragMoveEvent(QDragMoveEvent* event) { // 只接收从toolTree的拖动操作 WindowAppTreeTool* source = qobject_cast (event->source()); if (source) { event->acceptProposedAction(); event->accept(); } } ///// ///// 直接添加Tool功能块(from序列化文件) ///// ///// //void WindowAppPouView::addToolDirectly(TOOL* newTool, QPointF pos) //{ // ((WindowAppPouScene*)this->scene())->addNewItem(newTool, pos, true); //} ///// ///// 在界面中添加新的Link(from序列化文件) ///// ///// ///// //void WindowAppPouView::addLinkDirectly(const QString& strStartInf, const QString& strEndInf, LINK_MODE linkMode) //{ // ((WindowAppPouScene*)this->scene())->addLink(strStartInf, strEndInf, linkMode); //} /// /// 在界面中添加棋盘格背景 /// /// /// void WindowAppPouView::drawBackground(QPainter* painter, const QRectF& rect) { if (m_pBkImage) { painter->drawTiledPixmap(rect, *m_pBkImage); } } /// /// 自动缩放 /// /// 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()); } /// /// 初始化方格背景 /// 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(); }