bool QwtPlotPicker::end( bool ok ) { ok = QwtPicker::end( ok ); if ( !ok ) return false; QwtPlot *plot = QwtPlotPicker::plot(); if ( !plot ) return false; const QPolygon pa = selection(); if ( pa.count() == 0 ) return false; QwtPickerMachine::SelectionType selectionType = QwtPickerMachine::NoSelection; if ( stateMachine() ) selectionType = stateMachine()->selectionType(); switch ( selectionType ) { case QwtPickerMachine::PointSelection: { const QPointF pos = invTransform( pa[0] ); Q_EMIT selected( pos ); break; } case QwtPickerMachine::RectSelection: { if ( pa.count() >= 2 ) { const QPoint p1 = pa[0]; const QPoint p2 = pa[int( pa.count() - 1 )]; const QRect rect = QRect( p1, p2 ).normalized(); Q_EMIT selected( invTransform( rect ) ); } break; } case QwtPickerMachine::PolygonSelection: { QVector<QPointF> dpa( pa.count() ); for ( int i = 0; i < int( pa.count() ); i++ ) dpa[i] = invTransform( pa[i] ); Q_EMIT selected( dpa ); } default: break; } return true; }
bool QwtPlotPicker::end(bool ok) { ok = QwtPicker::end(ok); if ( !ok ) return false; QwtPlot *plot = QwtPlotPicker::plot(); if ( !plot ) return false; const QwtPolygon &pa = selection(); if ( pa.count() == 0 ) return false; if ( selectionFlags() & PointSelection ) { const QwtDoublePoint pos = invTransform(pa[0]); emit selected(pos); } else if ( (selectionFlags() & RectSelection) && pa.count() >= 2 ) { QPoint p1 = pa[0]; QPoint p2 = pa[int(pa.count() - 1)]; if ( selectionFlags() & CenterToCorner ) { p1.setX(p1.x() - (p2.x() - p1.x())); p1.setY(p1.y() - (p2.y() - p1.y())); } else if ( selectionFlags() & CenterToRadius ) { const int radius = qwtMax(qwtAbs(p2.x() - p1.x()), qwtAbs(p2.y() - p1.y())); p2.setX(p1.x() + radius); p2.setY(p1.y() + radius); p1.setX(p1.x() - radius); p1.setY(p1.y() - radius); } emit selected(invTransform(QRect(p1, p2)).normalized()); } else { QwtArray<QwtDoublePoint> dpa(pa.count()); for ( int i = 0; i < int(pa.count()); i++ ) dpa[i] = invTransform(pa[i]); emit selected(dpa); } return true; }
bool RectPicker::end(bool ok) { if (!ok)//更改代码处:,正常结束后,并不停止。只有reset时候,end(false)停止选择,重置状态机 QwtPicker::end(ok); if (!ok) return false; QwtPlot *plot = QwtPlotPicker::plot(); if (!plot) return false; const QPolygon points = selection(); if (points.count() == 0) return false; QwtPickerMachine::SelectionType selectionType = QwtPickerMachine::NoSelection; if (stateMachine()) selectionType = stateMachine()->selectionType(); switch (selectionType) { case QwtPickerMachine::PointSelection: { const QPointF pos = invTransform(points.first()); Q_EMIT selected(pos); break; } case QwtPickerMachine::RectSelection: { if (points.count() >= 2) { const QPoint p1 = points.first(); const QPoint p2 = points.last(); QPointF pF1 = invTransform(p1); QPointF pF2 = invTransform(p2); const QRect rect = QRect(p1, p2).normalized(); const QRect rect11 = QRect(p1, p2); QPoint pp1 = rect.topLeft(); QPoint pp2 = rect.bottomRight(); //const QRect rect = QRect(p1, p2); QRectF rect1 = invTransform(rect); QPointF topLeft = rect1.topLeft(); QPointF bottomRight = rect1.bottomRight(); Q_EMIT selected(invTransform(rect)); } break; } case QwtPickerMachine::PolygonSelection: { QVector<QPointF> dpa(points.count()); for (int i = 0; i < points.count(); i++) dpa[i] = invTransform(points[i]); Q_EMIT selected(dpa); } default: break; } return ok; }