рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдХреНрдпреВрдЯреА рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рджреГрд╢реНрдп рдлрд╝реНрд░реЗрдорд╡рд░реНрдХ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рд╣реИ, рдЬреЛ рдХрд┐ рд╣реЗрдмреНрд░реЗ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рд╕реЗ рд╡рдВрдЪрд┐рдд рд╣реИред рдореИрдВ рдЙрд╕реЗ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕рдорд░реНрдкрд┐рдд рдХрд░рдХреЗ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реБрдзрд╛рд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред рдФрд░ рдЗрд╕ рдкрд╛рдпрд▓рдЯ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рдЖрдк рдЗрд╕ рдЕрджреНрднреБрдд рд░реВрдкрд░реЗрдЦрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдп рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдХрд╛рд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдЧреНрд░рд╛рдлрд╝ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЪреБрдирд╛ред рдЗрд╕рдореЗрдВ рд╕рдм рдХреБрдЫ рд╣реИ:
- рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдПрдВ: рдкрд╛рда рдФрд░ рдкреНрд░рд╛рдЗрдорд░реА рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрдпреЛрдЬрди
- рд░рдЪрдирд╛ рдХрд╛рд░реНрдп: рд╢реАрд░реНрд╖рдХреЛрдВ, рдХреБрд▓реНрд╣рд╛рдбрд╝рд┐рдпреЛрдВ рдкрд░ рд▓реЗрдмрд▓ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдареАрдХ рд╣реИ, рдЧреНрд░рд╛рдл рдХреЗ рд╕рд╛рде рд╣реА рд╕рдордиреНрд╡рдп рдХреНрд╖реЗрддреНрд░
- рдПрдХ рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп: рдбреЗрдЯрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрджрд░реНрдн рдХреЗ рдПрдХ рдлреНрд░реЗрдо рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
- рддрддреНрд╡реЛрдВ рдХреЗ рдмреАрдЪ рдЗрдВрдЯрд░реИрдХреНрд╢рди: рд╢реЗрдбреНрдпреВрд▓ рдХреЛ рдЬреЛрдбрд╝рдиреЗ, рд╣рдЯрд╛рдиреЗ рдФрд░ рдмрджрд▓рдиреЗ рдкрд░ рдХрдо рд╕реЗ рдХрдо, рдХрд┐рдВрд╡рджрдВрддреА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред
рддреБрд░рдВрдд рдПрдХ рдЖрд░рдХреНрд╖рдг рдХрд░реЗрдВ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдХреЗрд╡рд▓ рдореБрдЦреНрдп рдЪрд┐рдкреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг, рдпрджрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЙрддреНрд╕реБрдХ рд╣реИ, рддреЛ рдЗрд╕реЗ
рдпрд╣рд╛рдВ рд▓реЗ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред
рд░реВрдкрд░реЗрдЦрд╛ рдХреА рдкрд╣рд▓реА рд╕реБрд╡рд┐рдзрд╛ рдбрд┐рдЬрд╛рдЗрди рдЪрд░рдг рдореЗрдВ рдЦреБрд▓рддреА рд╣реИред рддреЛ, рдХрд╛рд░реНрдп рдпреЛрдЬрдирд╛, рдЬреЛ рд╣рдорд╛рд░реЗ рдЙрдкрдХрд░рдг рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреА рд╣реИ:
- рдЖрдЗрдП рдПрдХ рджреГрд╢реНрдп рдмрдирд╛рдПрдВ, рдЬрд┐рд╕ рдкрд░ рд╣рдо рдЧреНрд░рд╛рдлрд╝ рдмрдирд╛рдПрдВрдЧреЗ: рд╣рдо рдХреБрд▓реНрд╣рд╛рдбрд╝рд┐рдпреЛрдВ рдФрд░ рд╕рдордиреНрд╡рдп рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рд▓реЗрдмрд▓ рдмрдирд╛рддреЗ рд╣реИрдВред
- рдПрдХ рд╕рдордиреНрд╡рдп рдЧреНрд░рд┐рдб рдмрдирд╛рдПрдВ (рдФрд░ рдпрд╣рд╛рдВ рд╣рдо рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЧреНрд░рд╛рдлрд╝ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░реЗрдВрдЧреЗ)ред
- рдЕрдиреБрд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдЖрдЗрдЯрдо рдмрдирд╛рдПрдБред
- рдПрдХ рдХрд┐рдВрд╡рджрдВрддреА рдмрдирд╛рдПрдБред
рдкрд╣рд▓рд╛ рдЪрд░рдгред рдПрдХ рд░рдЪрдирд╛ рдмрдирд╛рдирд╛ред
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рдаclass GraphicsPlotNocksTube : public QGraphicsItem { public: GraphicsPlotNocksTube(QGraphicsItem *parent): QGraphicsItem(parent){} void updateNocks(const QList<QGraphicsSimpleTextItem*>& nocks); QRectF boundingRect()const {return m_boundRect;} void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *){} inline const QFont &font(){return m_NocksFont;} private: QList<QGraphicsSimpleTextItem*> m_nocks; QFont m_NocksFont; QPen m_nockPen; QRectF m_boundRect; }; class Graphics2DPlotGrid: public QGraphicsItem { public: Graphics2DPlotGrid(QGraphicsItem * parent); QRectF boundingRect() const; const QRectF & rect() const; void setRange(int axisNumber, double min, double max); void setMainGrid(int axisNumber, double zero, double step); void setSecondaryGrid(int axisNumber, double zero, double step); void setMainGridPen(const QPen & pen); void setSecondaryGridPen(const QPen &pen); inline QPen mainGridPen(){return m_mainPen;} inline QPen secondaryGridPen(){return m_secondaryPen;} void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); public: struct AxisGuideLines { AxisGuideLines(): showLines(true){} QVector<QLineF> lines; bool showLines; }; AxisGuideLines abscissMainLines; AxisGuideLines abscissSecondaryLines; AxisGuideLines ordinateMainLines; AxisGuideLines ordinateSecondaryLines; private: void paintAxeGuidLines(const AxisGuideLines& axe, QPainter *painter, const QPen &linePen); QPen m_mainPen; QPen m_secondaryPen; QRectF m_rect; }; void Graphics2DPlotGrid::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { Q_UNUSED(option) Q_UNUSED(widget) paintAxeGuidLines(abscissSecondaryLines, painter, m_secondaryPen); paintAxeGuidLines(abscissMainLines, painter, m_mainPen); paintAxeGuidLines(ordinateSecondaryLines, painter, m_secondaryPen); paintAxeGuidLines(ordinateMainLines, painter, m_mainPen); painter->setPen(m_mainPen); painter->drawRect(m_rect); } class GraphicsPlotItemPrivate { Q_DECLARE_PUBLIC(GraphicsPlotItem) GraphicsPlotItem* q_ptr; GraphicsPlotItemPrivate(GraphicsPlotItem* parent); void compose(); void calculateAndSetTransForm(); void autoSetRange(); void autoSetGrid(); void calculateOrdinateGrid(); void calculateAbscissGrid(); void setAxisRange(int axisNumber, double min, double max); Graphics2DPlotGrid * gridItem; QGraphicsSimpleTextItem * abscissText; QGraphicsSimpleTextItem * ordinateText; QGraphicsSimpleTextItem *titleText; QFont titleFont; QFont ordinaateFont; QFont abscissFont; QRectF rect; QRectF m_sceneDataRect; GraphicsPlotLegend *m_legend; GraphicsPlotNocksTube* ordinateMainNocks; GraphicsPlotNocksTube* ordinateSecondaryNocks; GraphicsPlotNocksTube* abscissSecondaryNocks; GraphicsPlotNocksTube* abscissMainNocks; struct Range{ double min; double max; }; struct AxisGuideLines { AxisGuideLines():baseValue(0.0), step(0.0){} double baseValue; double step; }; AxisGuideLines abscissMainLines; AxisGuideLines abscissSecondaryLines; AxisGuideLines ordinateMainLines; AxisGuideLines ordinateSecondaryLines; Range abscissRange; Range ordinateRange; bool isAutoGrid; bool isAutoSecondaryGrid; public: void range(int axisNumber, double *min, double *max); };
рд╣рдо рд░рдЪрдирд╛ рдХрд░рддреЗ рд╣реИрдВ:
void GraphicsPlotItemPrivate::compose() { titleText->setFont(titleFont); abscissText->setFont(abscissFont); if(titleText->boundingRect().width() > rect.width()){
рдЧреНрд░рд┐рдб рдмрдирд╛рдПрдВ
рдЕрдм рдЪрд▓реЛ рдЧреНрд░рд┐рдб рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╢реБрд░реВ рдореЗрдВ рдРрд╕рд╛ рд▓рдЧрддрд╛ рдерд╛ рдХрд┐ рд▓реЗрдмрд▓ рдХреЛ рд╕рдордиреНрд╡рдп рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЦреАрдВрдЪрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд░реВрдкрд░реЗрдЦрд╛ рдХреА рдШреЛрд╖рдгрд╛рддреНрдордХ рд╡рд┐рдЪрд╛рд░рдзрд╛рд░рд╛ рдХреЗ рд▓рд┐рдП рдХрд╛рдЙрдВрдЯрд░ рдЪрд▓рд╛рддрд╛ рд╣реИ: рдпрд╣ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдЗрдЯрдо рдХреЛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреИрд╕реЗ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдлрд┐рд░ рджреГрд╢реНрдп рдХреЛ рдмрддрд╛рдПрдВ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рд╣реА рддрд╕реНрд╡реАрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╕реЗрд░рд┐рдлрд╝ рдХреЗ рд▓реЗрдЖрдЙрдЯ рдХреЛ рд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдФрд░ рдЕрдм, рдЙрдирдХреЗ рдмрд┐рдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рд┐рд░реНрдл рдПрдХ рдЧреНрд░рд┐рдб рдмрдирд╛рддреЗ рд╣реИрдВред рд╣рдорд╛рд░рд╛ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░: рдЧреНрд░рд╛рдл рдбреЗрдЯрд╛ рдХреЗ рд╕рдорд╛рди рдкреИрдорд╛рдиреЗ рдкрд░ рдЧреНрд░рд┐рдб рдЗрдЯреЗрдо рдбреНрд░рд╛ рдХрд░реЗрдВ, рдФрд░ рдХреНрдпреВрдЯреА рдЕрдиреБрд╡рд╛рдж рдХреЛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рдХрд░реЗрдВред рдЕрдЧрд░ рдЕрдм рд╣рдо рдЧреНрд░рд╛рдл рдХреЛ рдЧреНрд░рд┐рдб рдЗрдЯреЗрдо рдХрд╛ рд╡рдВрд╢рдЬ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рд╣реИ:
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
void Graphics2DPlotGrid::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { Q_UNUSED(option) Q_UNUSED(widget) paintAxeGuidLines(abscissSecondaryLines, painter, m_secondaryPen); paintAxeGuidLines(abscissMainLines, painter, m_mainPen); paintAxeGuidLines(ordinateSecondaryLines, painter, m_secondaryPen); paintAxeGuidLines(ordinateMainLines, painter, m_mainPen); painter->setPen(m_mainPen); painter->drawRect(m_rect); } void Graphics2DPlotGrid::paintAxeGuidLines(const AxisGuideLines& axe, QPainter *painter, const QPen &linePen) { if(axe.showLines){ painter->setPen(linePen); painter->drawLines(axe.lines); } } void GraphicsPlotItemPrivate::calculateAndSetTransForm() { double scaleX = m_sceneDataRect.width()/gridItem->rect().width(); double scaleY = m_sceneDataRect.height()/gridItem->rect().height(); QTransform transform = QTransform::fromTranslate( - gridItem->rect().x()*scaleX + m_sceneDataRect.x(), - gridItem->rect().y()*scaleY +m_sceneDataRect.y()); transform.scale(scaleX, -scaleY); gridItem->setTransform(transform); ordinateMainNocks->setTransform(transform);
рдЧреНрд░рд┐рдб рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ void GraphicsPlotItemPrivate::calculateOrdinateGrid() { const QRectF r = gridItem->boundingRect(); if(fabs(r.width()) < std::numeric_limits<float>::min()*5.0 || fabs(r.height()) < std::numeric_limits<float>::min()*5.0) return; QList<QGraphicsSimpleTextItem*> nocksList; auto calculteLine = [&] (AxisGuideLines* guides, QVector<QLineF> *lines) { int k; double minValue; int count; nocksList.clear(); if(fabs(guides->step) > std::numeric_limits<double>::min()*5.0 ) { k = (ordinateRange.min - guides->baseValue)/guides->step; minValue = k*guides->step+guides->baseValue; count = (ordinateRange.max - minValue)/guides->step;
рдПрдХ рд╕реВрдХреНрд╖реНрдо рдмрд┐рдВрджреБ рд╣реИ: рдЬрдм рдЖрдк рд╣рдорд╛рд░реЗ рдЧреНрд░рд┐рдб рдЗрдЯреЗрдо рдХреА рдХреНрдпреВрдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо рдХреА рдорджрдж рд╕реЗ рдмрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдмреНрд░рд╢ рдХрд╛ рдЖрдХрд╛рд░ рднреА рдмрдврд╝рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдРрд╕рд╛ рди рд╣реЛ, рдЖрдкрдХреЛ рдХреЙрд╕реНрдореЗрдЯрд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпреВрдкреЗрди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
m_secondaryPen.setCosmetic(true); m_mainPen.setCosmetic(true);
рдЖрдЗрдЯрдо рдЧреНрд░рд╛рдлрд┐рдХреНрд╕
рд╡рд░реНрдЧ рдШреЛрд╖рдгрд╛ class GraphicsDataItem: public QGraphicsObject { Q_OBJECT public: GraphicsDataItem(QGraphicsItem *parent =0); ~GraphicsDataItem(); void setPen(const QPen& pen); QPen pen(); void setBrush(const QBrush & brush); QBrush brush(); void ordinateRange(double *min, double *max); void abscissRange(double *min, double *max); void setTitle(const QString & title); QString title(); inline int type() const {return GraphicsPlot::DataType;} Q_SIGNALS: void dataItemChange(); void penItemChange(); void titleChange(); protected: void setOrdinateRange(double min, double max); void setAbscissRange(double min, double max); private: Q_DECLARE_PRIVATE(GraphicsDataItem) GraphicsDataItemPrivate *d_ptr; }; class Graphics2DGraphItem: public GraphicsDataItem { Q_OBJECT public: Graphics2DGraphItem(QGraphicsItem *parent =0); Graphics2DGraphItem(double *absciss, double *ordinate, int length, QGraphicsItem *parent =0); ~Graphics2DGraphItem(); void setData(double *absciss, double *ordinate, int length); void setData(QList<double> absciss, QList<double> ordinate); void setData(QVector<double> absciss, QVector<double> ordinate); QRectF boundingRect() const; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); private: Q_DECLARE_PRIVATE(Graphics2DGraphItem) Graphics2DGraphItemPrivate *d_ptr; };
рдЧреНрд░рд╛рдл рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрддреНрдпрдВрдд рд╕рд░рд▓ рд╣реИ рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб рд╕реАрдорд╛рдУрдВ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдХреЗ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
class Graphics2DGraphItemPrivate { Q_DECLARE_PUBLIC(Graphics2DGraphItem) Graphics2DGraphItem *q_ptr; Graphics2DGraphItemPrivate(Graphics2DGraphItem *parent):q_ptr(parent){} QVector<QLineF> m_lines; template<typename T> void setData(T absciss, T ordinate, qint32 length) { q_ptr->prepareGeometryChange(); --length; m_lines.resize(length); Range ordinateRange; ordinateRange.min = ordinate[0]; ordinateRange.max = ordinate[0]; Range abscissRange; abscissRange.min = absciss[0]; abscissRange.max = absciss[0]; for(int i =0; i < length; ++i) { if(ordinate[i+1] > ordinateRange.max) ordinateRange.max = ordinate[i+1]; else if(ordinate[i+1] < ordinateRange.min ) ordinateRange.min = ordinate[i+1]; if(absciss[i+1] > abscissRange.max) abscissRange.max = absciss[i+1]; else if(absciss[i+1] < abscissRange.min ) abscissRange.min = absciss[i+1]; m_lines[i].setLine(absciss[i], ordinate[i], absciss[i+1], ordinate[i+1]); } m_boundRect.setRect(abscissRange.min, ordinateRange.min, abscissRange.max - abscissRange.min, ordinateRange.max - abscissRange.min); q_ptr->setOrdinateRange(ordinateRange.min, ordinateRange.max); q_ptr->setAbscissRange(abscissRange.min, abscissRange.max); q_ptr->update(); QMetaObject::invokeMethod(q_ptr, "dataItemChange"); } QRect m_boundRect; }; QRectF Graphics2DGraphItem::boundingRect() const { return d_ptr->m_boundRect; } void Graphics2DGraphItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { Q_UNUSED(option) Q_UNUSED(widget) painter->setBrush(brush()); painter->setPen(pen()); painter->drawLines(d_ptr->m_lines); }
рдХрд┐рдВрд╡рджрдВрддреА рдФрд░ рдХрдХреНрд╖рд╛ рдХреА рдмрд╛рддрдЪреАрдд
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдзреНрдпрд╛рди рджреЗрддреЗ рд╣реИрдВ рдХрд┐
GraphicsDataItem QGraphicsObject рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд
рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕рдВрдХреЗрдд рдХреНрд▓рд╛рд╕ рдмреЙрдбреА рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдШреЛрд╖рд┐рдд рд╣реИрдВред рдпрд╛рдиреА рджреГрд╢реНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рд╣реЛрддреА рд╣реИ - рд╕рдВрдХреЗрддреЛрдВ рдФрд░ рд╕реНрд▓реЙрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред
рд╡рд┐рд╖рдп рдкрд░рд┐рдгрд╛рдо
рдФрд░ рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
- рдпрджрд┐ рдЖрдк рдврд╛рдВрдЪреЗ рдХреЗ рддрд░реНрдХ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдмрд╛рдзрд╛ рд░рд╣рд┐рдд рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╡рд┐рдХрд╛рд╕ред
- рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ рдШреЛрд╖рдгрд╛рддреНрдордХ рд╢реИрд▓реА рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдореБрдЦреНрдп рдХреЛрдб рд╕рд╛рд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рд╣рдж рддрдХ рдЪрд╛рд░реЛрдВ рдУрд░ рдиреГрддреНрдп рдХрд░рддрд╛ рд╣реИред
- рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЗрдЯрдо рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░реЛрд╕реНрдЯреЗрдЯ
Qwt рддреБрд▓рдирд╛ рдФрд░ рдЕрдВрд╢рд╛рдВрдХрдиред
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдФрд░ рд╣рдорд╛рд░реА рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рд╕рдВрд╡реЗрджрдирд╛ рдХреЛ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдп рдХреА рдорд╛рддреНрд░рд╛ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ рдФрд░ рд╕рдореНрдорд╛рдирд┐рдд qw рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рд╣реИ:
- рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рдЖрдкрдХреА рдЖрдВрдЦ рдХреЛ рдкрдХрдбрд╝рддреА рд╣реИ рд╡рд╣ рд╣реИ рдбреНрд░рд╛ рдЗрдЯрдореЗрдВрдо рдХреА рд╡рд┐рд╢рд╛рд▓ рд▓рд┐рд╕реНрдЯрд┐рдВрдЧред рд╣рдорд╛рд░реА рдЙрдореНрд░ рдмрд╣реБрдд рдХрдо рд╣реИред рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕рджрд╕реНрдп рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдо рдЗрд╕реЗ рдПрдХ рдмрд╛рд░ рдФрд░ рдПрдХ рдЬрдЧрд╣ рдкрд░ рдХрд░рддреЗ рд╣реИрдВ - рдЬрдм рд╣рдо рд╡реНрдпреВрдкреЛрд░реНрдЯ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ ..
- QwtLegendData, QwtLegendLabel, QwtPainter, QwtPainterCommand, QwtPlotDirectPainter, рдЖрджрд┐ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд╛рдо рдХрд╛ рдирд┐рд╡реЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдордиреЗ рдпрд╣ рд╕рдм рдирд╣реАрдВ рдХрд┐рдпрд╛ рдФрд░ рдЗрди рд╕рднреА рдХреЛ рд╣рдорд╛рд░реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИрдВред
- рд╣рдореЗрдВ рдПрдХ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рджреВрд╕рд░реЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреЙрд░реНрдбрд┐рдиреЗрд╢рди рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдФрд░ рд░реВрдкрд╛рдВрддрд░рдг рдХреА рдЕрдкрдиреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
- рд╣рдордиреЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде iem s рдХреА рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрдореВрд░реНрддрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХреА рд╣реИред
- рд╣рдорд╛рд░реА рд╢реНрд░реЗрдгреА рдкрджрд╛рдиреБрдХреНрд░рдо рдкрд░рд┐рдорд╛рдг рд╕рд░рд▓ рдХрд╛ рдПрдХ рдХреНрд░рдо рд╣реИред рдФрд░ рдЖрдЧреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд╕рд╛рде, рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХреНрдпреЛрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рдВрджрд░реНрдн
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг ред
рд╡реАрдбрд┐рдпреЛ , рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдПрдХ рдСрдл рд╕рд╛рдЗрдЯ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ youtube рдкрд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ
рдкреНрд░реЛрдЬреЗрдХреНрдЯ ред
рдкреБрдирд╢реНрдЪ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХ рдбреЗрдореЛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреАрдбрд╝реЗ рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдпрд╛ рдЬреЛ рд╕реБрдзрд╛рд░ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗ, рддреЛ рдореБрдЭреЗ рдХреЗрд╡рд▓ рдЦреБрд╢реА рд╣реЛрдЧреАред
PPS рдЬрд╕реНрдЯ рдХреЗрд╕ рдореЗрдВ: CC-BY 3.0 рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рддрд╣рдд рдкреНрд░рдХрд╛рд╢рд┐рдд рдЯреЗрдХреНрд╕реНрдЯUPD рдЖрдзрд╛ рдкреНрд░рдпрд╛рд╕ рдкрд░рд┐рдгрд╛рдо:
