//#include //#include #include "ZxBaseUtil.h" #include "zxLogInstance.h" #include "ZxPaintParam.h" #include "ZxSubAxisX.h" #include "ZxSubAxisY.h" #include "nmPlotScene.h" #include "nmPlotView.h" ZX_DEFINE_DYNAMIC(mPlotView, nmPlotView) nmPlotView::nmPlotView() { } void nmPlotView::onPrepareContextMenu(QMenu* pMenu, const QPointF& pos) { { nmPlotScene* pScene = dynamic_cast(getScene()); if (NULL != pScene && NULL != pScene->m_pPlot) { ZxPlot* pPlot = pScene->m_pPlot; pPlot->onPrepareContextMenu(pMenu, pos); { QAction* pAction = pMenu->addAction(zxLoadIcon("Undo"), tr("Undo")); connect(pAction, SIGNAL(triggered()), this, SLOT(slotUndo())); pAction->setEnabled(pPlot->canUndo()); } { QAction* pAction = pMenu->addAction(zxLoadIcon("Redo"), tr("Redo")); connect(pAction, SIGNAL(triggered()), this, SLOT(slotRedo())); pAction->setEnabled(pPlot->canRedo()); } pMenu->addSeparator(); } pMenu->addSeparator(); } __super::onPrepareContextMenu(pMenu, pos); } // 拖拽支持 void nmPlotView::dragEnterEvent(QDragEnterEvent *event) { m_bDraging = false; emit sigCheckDragAccepted(event, m_bDraging); if (m_bDraging) { event->accept(); } } void nmPlotView::dropEvent(QDropEvent *event) { if (m_bDraging) { m_bDraging = false; emit sigDealwithDrop(event); event->accept(); } } void nmPlotView::mouseMoveEvent(QMouseEvent* e) { ZxRenderView::mouseMoveEvent(e); nmPlotScene* pScene = dynamic_cast(ZxRenderView::getScene()); if (NULL == pScene || NULL == pScene->m_pPlot) { return; } QPointF pos = mapToScene(QPoint(e->x(), e->y())); ZxTempLayer* pTempLayer = pScene->getTempLayer(); if (NULL != pTempLayer) { // 范围 QRectF rt = pScene->m_pPlot->getInnerRectF(); pTempLayer->setCrossLineRect(rt); // 位置 pTempLayer->setCrossLinePos(pos); // 文字 { ZxSubAxisBase* pX = dynamic_cast(pScene->m_pPlot->getMainAxisX()); ZxSubAxisBase* pY = dynamic_cast(pScene->m_pPlot->getMainAxisY()); ZxSubAxisBase* pY2 = pScene->m_pPlot->getSysAxisY(AP_Right); if (NULL != pY2) //加入双Y轴的考虑 { if (!pY2->isVisible() || pY2->isMinimizeAxis() || pY2 == pY) pY2 = NULL; } double fX = pX->getValueForPos(pos.x()); double fY = pY->getValueForPos(pos.y()); QString sValueX = ZxBaseUtil::getValidStr(fX, 3); QString sValueY = ZxBaseUtil::getValidStr(fY, 3); QString sValueY2 = ""; if (NULL != pY2)//加入双Y轴的考虑 { double fY2 = pY2->getValueForPos(pos.y()); sValueY2 = ZxBaseUtil::getValidStr(fY2, 3); } QString sTipsEx = ""; emit sigGetTipsExOfPos(sTipsEx, fX, fY); //此处不考虑双Y轴,TODO // tips QString s = QString("%1:%2 %3").arg(pX->getName()).arg(sValueX).arg(pX->getUnit()); s += ";"; if (!sTipsEx.isEmpty()) { QPen pen = QPen(QColor(128, 128, 128)); pTempLayer->setCrossLinePen(pen); pen.setWidthF(.1f); s += sTipsEx; } else { pTempLayer->setCrossLinePen(QPen(QColor(192, 192, 192))); s += QString("%1:%2 %3").arg(pY->getName()).arg(sValueY).arg(pY->getUnit()); if (!sValueY2.isEmpty() && NULL != pY2) s += QString(";%1:%2 %3").arg(pY2->getName()).arg(sValueY2).arg(pY2->getUnit()); } pTempLayer->setTips(s); // 状态栏 if (rt.contains(pos)) { s = tr(" Current Pos:%1-%2").arg(sValueX).arg(sValueY); if (!sValueY2.isEmpty()) s += QString("-%1").arg(sValueY2); if (!sTipsEx.isEmpty()) { s += " "; s += sTipsEx; } } else { s = ""; } emit sigFresh2Status(s); } } } void nmPlotView::focusOutEvent(QFocusEvent *e) { ZxRenderView::focusOutEvent(e); nmPlotScene* pScene = dynamic_cast(ZxRenderView::getScene()); if (NULL != pScene) { ZxTempLayer* pTempLayer = pScene->getTempLayer(); if (NULL != pTempLayer) { pTempLayer->clearLineAndTips(); return; } } } void nmPlotView::leaveEvent(QEvent *e) { ZxRenderView::leaveEvent(e); nmPlotScene* pScene = dynamic_cast(ZxRenderView::getScene()); if (NULL != pScene) { ZxTempLayer* pTempLayer = pScene->getTempLayer(); if (NULL != pTempLayer) { pTempLayer->clearLineAndTips(); // return; } } QString s = ""; emit sigFresh2Status(s); }