//! Redraw grid, curves, and markers. The draw code // does not clear clipRegion prior to painting. // \param p painter used for drawing void QwtPlot::drawCanvas(QPainter *p) { QwtDiMap map[axisCnt]; for ( int axis = 0; axis < axisCnt; axis++ ) map[axis] = canvasMap(axis); QRect rect = d_canvas->contentsRect(); // // draw grid // if ( d_grid.enabled() && axisEnabled( d_grid.xAxis() ) && axisEnabled( d_grid.yAxis() ) ) { d_grid.draw(p, rect, map[d_grid.xAxis()], map[d_grid.yAxis()]); } // // draw curves // QIntDictIterator<QwtPlotCurve> itc(*d_curves); for (QwtPlotCurve *curve = itc.toFirst(); curve != 0; curve = ++itc ) { if ( curve->enabled() && axisEnabled( curve->xAxis() ) && axisEnabled( curve->yAxis() ) ) { curve->draw(p, map[curve->xAxis()], map[curve->yAxis()]); } } // // draw markers // QIntDictIterator<QwtPlotMarker> itm(*d_markers); for (QwtPlotMarker *marker = itm.toFirst(); marker != 0; marker = ++itm ) { if ( marker->enabled() && axisEnabled( marker->xAxis() ) && axisEnabled( marker->yAxis() ) ) { marker->draw(p, map[marker->xAxis()].transform(marker->xValue()), map[marker->yAxis()].transform(marker->yValue()), rect); } } }
// Select the point at a position. void XtalOptPlot::select(const QPoint& pos) { QwtPlotMarker* selection = nullptr; // Must be within 10 pixels at least double dist = 10.0; const QwtPlotItemList& itmList = itemList(); for (QwtPlotItemIterator it = itmList.begin(); it != itmList.end(); ++it) { if ((*it)->rtti() == QwtPlotItem::Rtti_PlotMarker) { QwtPlotMarker* m = static_cast<QwtPlotMarker*>(*it); // We have to map the plot coordinates onto widget coordinates before // comparing const QwtScaleMap& xMap = canvasMap(m->xAxis()); const QwtScaleMap& yMap = canvasMap(m->yAxis()); double mx = xMap.transform(m->xValue()); double my = yMap.transform(m->yValue()); double d = distance(QPointF(mx, my), pos); if (d < dist) { selection = m; dist = d; } } } selectMarker(selection); }
/*! \return the y axis to which a marker is attached \param key Marker key */ int QwtPlot::markerYAxis(long key) const { QwtPlotMarker *m = d_markers->find(key); if (m) return m->yAxis(); else return -1; }
void QwtPlot::drawCanvasItems(QPainter *painter, const QRect &rect, const QwtArray<QwtDiMap> &map, const QwtPlotPrintFilter &pfilter) const { // // draw grid // if ( pfilter.options() & QwtPlotPrintFilter::PrintGrid ) { if ( d_grid->enabled() ) { d_grid->draw(painter, rect, map[d_grid->xAxis()], map[d_grid->yAxis()]); } } // // draw curves // QwtPlotCurveIterator itc = curveIterator(); for (QwtPlotCurve *curve = itc.toFirst(); curve != 0; curve = ++itc ) { if ( curve->enabled() ) { curve->draw(painter, map[curve->xAxis()], map[curve->yAxis()]); } } // // draw markers // QwtPlotMarkerIterator itm = markerIterator(); for (QwtPlotMarker *marker = itm.toFirst(); marker != 0; marker = ++itm ) { if ( marker->enabled() ) { marker->draw(painter, map[marker->xAxis()].transform(marker->xValue()), map[marker->yAxis()].transform(marker->yValue()), rect); } } }
/*! \brief Find the marker which is closest to a given point. \param xpos \param ypos coordinates of a point in the plotting region \retval dist Distance in points between the marker and the specified point. \return Key of the closest marker or 0 if no marker was found */ long QwtPlot::closestMarker(int xpos, int ypos, int &dist) const { QwtDiMap map[axisCnt]; for ( int axis = 0; axis < axisCnt; axis++ ) map[axis] = canvasMap(axis); long rv = 0; double dmin = 1.0e10; QwtPlotMarkerIterator itm = markerIterator(); for (QwtPlotMarker *m = itm.toFirst(); m != 0; m = ++itm ) { double cx = map[m->xAxis()].xTransform(m->xValue()); double cy = map[m->yAxis()].xTransform(m->yValue()); if (m->lineStyle() == QwtMarker::HLine) { if (m->symbol().style() == QwtSymbol::None) cx = double(xpos); } else if (m->lineStyle() == QwtMarker::VLine) { if (m->symbol().style() == QwtSymbol::None) cy = double(ypos); } double f = qwtSqr(cx - double(xpos)) + qwtSqr(cy - double(ypos)); if (f < dmin) { dmin = f; rv = itm.currentKey(); } } dist = int(sqrt(dmin)); return rv; }