#include "TransparentDraggableFac.h" extern double g_dPixelPerCm;//每厘米像素数 //static GeoIndicatorGenerator m_drawGeo; TransparentDraggableFac::TransparentDraggableFac(QMyCustomPlot *parentPlot, QString strUuid, double minWidth, QString strTitle) : QObject(parentPlot), mPlot(parentPlot), mstrTitle(strTitle), mMinWidth(minWidth) { m_strUuid = strUuid; // initRect(); } TransparentDraggableFac::~TransparentDraggableFac() { if(mPlot) { // mPlot->removeItem(mRect); // mPlot->removeItem(mLeftHandle); // mPlot->removeItem(mRightHandle); } } //设置最小宽度 void TransparentDraggableFac::setMinWidth(double minWidth) { mMinWidth = minWidth; } //设置标题 void TransparentDraggableFac::setTitle(QString strTitle) { mstrTitle = strTitle; mItemTitle->setText(mstrTitle); //mPlot->replot(); } // 设置矩形范围 void TransparentDraggableFac::setRange(double left_Low, double right_Hight) { if(left_Low >= right_Hight) return; double lY1 = mPlot->yAxis->range().lower;//+10 double lY2 = mPlot->yAxis->range().upper; mRect->topLeft->setCoords(left_Low, 3*(lY1+lY2)/4.0); mRect->bottomRight->setCoords(right_Hight, lY2); //位置与rect不一样,否则图像反转 // mPixmap->topLeft->setCoords(right_Hight, lY1); // mPixmap->bottomRight->setCoords(left_Low, (lY1+lY2)/2.0); //mItemTitle->position->setCoords(0.5, 0.5); // 设置父锚点,定位点 //mItemTitle->position->setParentAnchor(mRect->bottom); // mItemTitle->position->setCoords((mRect->topLeft->coords().x() + mRect->bottomRight->coords().x())/2, // (mRect->topLeft->coords().y() + mRect->bottomRight->coords().y())/2); // 设置文本在矩形中心位置 float flNewPos = mPlot->xAxis->coordToPixel((left_Low + right_Hight)/2.0) - 15; mItemTitle->position->setCoords(mPlot->xAxis->pixelToCoord(flNewPos), 7*(lY1 + lY2)/8.0); // 设置文本在矩形中心位置 //mRect->topLeft->setCoords(left, mPlot->yAxis->range().upper); //mRect->bottomRight->setCoords(right, mPlot->yAxis->range().lower); updateHandles(); mPlot->replot(); } // 获取当前范围 QCPRange TransparentDraggableFac::getRange() { return QCPRange(mRect->topLeft->coords().x(), mRect->bottomRight->coords().x()); } // 设置矩形颜色 void TransparentDraggableFac::setColor(const QColor &color) { mRect->setBrush(QBrush(color)); mRect->setPen(QPen(color.darker())); //mPlot->replot(); } // 删除框图 void TransparentDraggableFac::deleteRect() { if(mPlot) { // mRect->deleteLater(); // mLeftHandle->deleteLater(); // mRightHandle->deleteLater(); // mPixmap->deleteLater(); mPlot->m_mapDraggable_Fac.remove(m_strUuid); mPlot->removeItem(mRect); mPlot->removeItem(mLeftHandle); mPlot->removeItem(mRightHandle); //mPlot->removeItem(mPixmap); mPlot->removeItem(mItemTitle); mPlot->replot(); this->deleteLater(); // // //避免二次绘制框图 // mPlot->m_bDrawRect = false; // mDragMode = DragNone; // //取消选中框 // mPlot->selectionRect()->cancel(); // mPlot->replot(); // mPlot->selectionRect()->mActive=true; } } void TransparentDraggableFac::initRect() { // 创建透明矩形 mRect = new QCPItemRect(mPlot); mRect->setLayer("overlay"); // 确保在最上层 mRect->setBrush(QBrush(QColor(255, 255, 255, 50))); // 半透明蓝色 mRect->setPen(QPen(QColor(70, 70, 255, 200))); // 创建左右边界控制点 mLeftHandle = new QCPItemRect(mPlot); mLeftHandle->setLayer("overlay"); mLeftHandle->setBrush(QBrush(Qt::red)); mLeftHandle->setPen(QPen(Qt::darkRed)); mRightHandle = new QCPItemRect(mPlot); mRightHandle->setLayer("overlay"); mRightHandle->setBrush(QBrush(Qt::red)); mRightHandle->setPen(QPen(Qt::darkRed)); // 设置初始位置 //double center = mPlot->xAxis->range().center(); // setRange(center - 10, center + 10); // 连接鼠标事件 // connect(mPlot, &QCustomPlot::mousePress, this, &TransparentDraggableFac::onMousePress); // connect(mPlot, &QCustomPlot::mouseMove, this, &TransparentDraggableFac::onMouseMove); // connect(mPlot, &QCustomPlot::mouseRelease, this, &TransparentDraggableFac::onMouseRelease); // mPixmap = new QCPItemPixmap(mPlot); // //mPixmap->setPixmap(QPixmap(":/image/file.png")); // 设置图片 // mPixmap->setScaled(true, Qt::IgnoreAspectRatio); // 设置缩放方式 // mPixmap->setLayer("overlay"); // 确保在最上层 mItemTitle = new QCPItemText(mPlot); mItemTitle->setText(mstrTitle); //mItemTitle->setBrush(QBrush(Qt::red)); mItemTitle->setFont(QFont("Arial", 8, QFont::Bold)); mItemTitle->setColor(Qt::black); mItemTitle->setPositionAlignment(Qt::AlignTop | Qt::AlignHCenter); mItemTitle->position->setType(QCPItemPosition::ptPlotCoords); //mItemTitle->position->setType(QCPItemPosition::ptAxisRectRatio); mItemTitle->position->setCoords(0.5, 0); mItemTitle->setLayer("overlay"); mItemTitle->setRotation(90);//竖直文字 } void TransparentDraggableFac::updateHandles() { // 左边界矩形控制点 mLeftHandle->topLeft->setParentAnchor(mRect->topLeft); mLeftHandle->bottomRight->setParentAnchor(mRect->topRight);//(mRect->bottomLeft); mLeftHandle->topLeft->setCoords(-0.5, 0.5); // 矩形大小 mLeftHandle->bottomRight->setCoords(0.5, -0.5); // 矩形大小 // 右边界矩形控制点 mRightHandle->topLeft->setParentAnchor(mRect->bottomLeft); mRightHandle->bottomRight->setParentAnchor(mRect->bottomRight); mRightHandle->topLeft->setCoords(-0.5, 0.5); // 矩形大小 mRightHandle->bottomRight->setCoords(0.5, -0.5); // 矩形大小 } //void TransparentDraggableFac::onDelRect() //{ // //mDragMode = DragNone; // //删除框图 // deleteRect(); //} //void TransparentDraggableFac::onMousePress(QMouseEvent *event) //{ // if(event->button() != Qt::LeftButton)//右键 // { // double y = mPlot->xAxis->pixelToCoord(event->pos().y());//x轴展示深度 // QCPRange currentRange = getRange(); // if(mLeftHandle->selectTest(event->pos(), false) < 5) { // mDragMode = DragNone; // } // else if(mRightHandle->selectTest(event->pos(), false) < 5) { // mDragMode = DragNone; // } // //else if(x >= currentRange.lower && x <= currentRange.upper) { // else if(y >= currentRange.lower && y <= currentRange.upper) { // mDragMode = DragNone; // } // else { // mDragMode = DragNone; // return; // } // //event->accept(); // QMenu menu(nullptr); // QAction *delAction = menu.addAction("删除框图"); // //delAction->installEventFilter(this); // connect(delAction, &QAction::triggered, this, &TransparentDraggableFac::onDelRect); //// QAction* pItem = menu.exec(event->globalPos()); //// if(pItem == delAction) //// { //// //event->accept(); //// int ii=0; //// ii++; //// } // menu.exec(event->globalPos()); // return; // } // event->accept(); // // 检查点击了哪个部分 // //double x = mPlot->xAxis->pixelToCoord(event->pos().x()); // //double y = mPlot->yAxis->pixelToCoord(event->pos().y()); // double y = mPlot->xAxis->pixelToCoord(event->pos().y());//x轴展示深度 // QCPRange currentRange = getRange(); // if(mLeftHandle->selectTest(event->pos(), false) < 5) { // mDragMode = DragLeft; // } // else if(mRightHandle->selectTest(event->pos(), false) < 5) { // mDragMode = DragRight; // } // //else if(x >= currentRange.lower && x <= currentRange.upper) { // else if(y >= currentRange.lower && y <= currentRange.upper) { // mDragMode = DragRect; // } // else { // mDragMode = DragNone; // return; // } // //mDragStartX = x; // mDragStartY = y; // mDragStartRange = currentRange; //} //void TransparentDraggableFac::onMouseMove(QMouseEvent *event) //{ // if(mDragMode == DragNone) return; // event->accept(); // //double x = mPlot->xAxis->pixelToCoord(event->pos().x()); // //double dx = x - mDragStartX; // double y = mPlot->xAxis->pixelToCoord(event->pos().y()); // double dy = y - mDragStartY; // QCPRange newRange = mDragStartRange; // switch(mDragMode) { // case DragLeft: { // //double proposedLeft = mDragStartRange.lower + dx; // double proposedLeft = mDragStartRange.lower + dy; // // 确保不超出轴范围且不使宽度小于最小值 // newRange.lower = qBound( // //mPlot->xAxis->range().lower, // getMyLower(), // proposedLeft, // mDragStartRange.upper - mMinWidth); // break; // } // case DragRight: { // //double proposedRight = mDragStartRange.upper + dx; // double proposedRight = mDragStartRange.upper + dy; // // 确保不超出轴范围且不使宽度小于最小值 // newRange.upper = qBound( // mDragStartRange.lower + mMinWidth, // proposedRight, // getMyUpper()); // //mPlot->xAxis->range().upper); // break; // } // case DragRect: { // double width = mDragStartRange.size(); // //double center = mDragStartRange.center() + dx; // double center = mDragStartRange.center() + dy; // newRange.lower = center - width/2; // newRange.upper = center + width/2; // // 检查是否超出轴范围 // if(newRange.lower < getMyLower()) { // newRange.lower = getMyLower(); // newRange.upper = newRange.lower + width; // } // else if(newRange.upper > getMyUpper()) { // newRange.upper = getMyUpper(); // newRange.lower = newRange.upper - width; // } //// QCPRange axisRange = mPlot->xAxis->range(); //// if(newRange.lower < axisRange.lower) { //// newRange.lower = axisRange.lower; //// newRange.upper = newRange.lower + width; //// } //// else if(newRange.upper > axisRange.upper) { //// newRange.upper = axisRange.upper; //// newRange.lower = newRange.upper - width; //// } // break; // } // default: // break; // } //// //取整数(方便显示统计,左右边界整数显示。) //// newRange.lower = (int)newRange.lower; //// QCPRange rangeByFile = mPlot->xAxis->range(); //// if (std::fabs(rangeByFile.upper - (int)newRange.upper) >= 1.0) //// { //// newRange.upper = (int)newRange.upper; //// } // // 最终确保宽度不小于最小值(针对整体拖动的情况) // if(newRange.size() < mMinWidth) { // if(mDragMode == DragRect) { // // 如果是整体拖动,保持中心点不变 // double center = newRange.center(); // newRange.lower = center - mMinWidth/2; // newRange.upper = center + mMinWidth/2; // } else { // // 如果是边界拖动,强制设置最小宽度 // if(mDragMode == DragLeft) { // newRange.lower = newRange.upper - mMinWidth; // } else if(mDragMode == DragRight) { // newRange.upper = newRange.lower + mMinWidth; // } // } // } // setRange(newRange.lower, newRange.upper); //} //void TransparentDraggableFac::onMouseRelease(QMouseEvent *event) //{ // if(event->button() == Qt::LeftButton && mDragMode != DragNone) { // event->accept(); // //避免二次绘制框图 // mPlot->m_bDrawRect = false; // //emit rangeChanged(getRange()); // mDragMode = DragNone; // //取消选中状态 //// QCPDataSelection emptySelection; //// mPlot->graph(0)->setSelection(emptySelection); //// mPlot->replot(); // //取消选中框 // mPlot->selectionRect()->cancel(); // mPlot->replot(); // mPlot->selectionRect()->mActive=true; // } //} //double TransparentDraggableFac::getMyLower() //{ // double dLower = mPlot->xAxis->range().lower; // double proposedLeft = mDragStartRange.lower; // TransparentDraggableFac *pDraggableRect =NULL; // { // QMap::Iterator it = mPlot->m_mapDraggableFac.begin(); // while( it != mPlot->m_mapDraggableFac.end() ) // { // if(it.key() == m_strUuid) // { // it++; // continue; // } // pDraggableRect = (TransparentDraggableFac*)it.value(); // // // QCPRange tmpRange = pDraggableRect->getRange(); // if(tmpRange.upper >= dLower && tmpRange.upper <= proposedLeft) // { // dLower = tmpRange.upper; // } // it++; // } // } // return dLower; //} //double TransparentDraggableFac::getMyUpper() //{ // double dUpper = mPlot->xAxis->range().upper; // double proposedRight = mDragStartRange.upper; // TransparentDraggableFac *pDraggableRect =NULL; // { // QMap::Iterator it = mPlot->m_mapDraggableFac.begin(); // while( it != mPlot->m_mapDraggableFac.end() ) // { // if(it.key() == m_strUuid) // { // it++; // continue; // } // pDraggableRect = (TransparentDraggableFac*)it.value(); // // // QCPRange tmpRange = pDraggableRect->getRange(); // if(tmpRange.lower <= dUpper && tmpRange.lower >= proposedRight) // { // dUpper = tmpRange.lower; // } // it++; // } // } // return dUpper; //}