рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпреВрдЯреА рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд╡реНрдпреВ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреА рд╕реБрдВрджрд░рддрд╛ рдФрд░ рд╢рдХреНрддрд┐

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдХреНрдпреВрдЯреА рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рджреГрд╢реНрдп рдлрд╝реНрд░реЗрдорд╡рд░реНрдХ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рд╣реИ, рдЬреЛ рдХрд┐ рд╣реЗрдмреНрд░реЗ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рд╕реЗ рд╡рдВрдЪрд┐рдд рд╣реИред рдореИрдВ рдЙрд╕реЗ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕рдорд░реНрдкрд┐рдд рдХрд░рдХреЗ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реБрдзрд╛рд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред рдФрд░ рдЗрд╕ рдкрд╛рдпрд▓рдЯ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рдЖрдк рдЗрд╕ рдЕрджреНрднреБрдд рд░реВрдкрд░реЗрдЦрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдп рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдХрд╛рд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдЧреНрд░рд╛рдлрд╝ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЪреБрдирд╛ред рдЗрд╕рдореЗрдВ рд╕рдм рдХреБрдЫ рд╣реИ:

рддреБрд░рдВрдд рдПрдХ рдЖрд░рдХреНрд╖рдг рдХрд░реЗрдВ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдХреЗрд╡рд▓ рдореБрдЦреНрдп рдЪрд┐рдкреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг, рдпрджрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЙрддреНрд╕реБрдХ рд╣реИ, рддреЛ рдЗрд╕реЗ рдпрд╣рд╛рдВ рд▓реЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред
рд░реВрдкрд░реЗрдЦрд╛ рдХреА рдкрд╣рд▓реА рд╕реБрд╡рд┐рдзрд╛ рдбрд┐рдЬрд╛рдЗрди рдЪрд░рдг рдореЗрдВ рдЦреБрд▓рддреА рд╣реИред рддреЛ, рдХрд╛рд░реНрдп рдпреЛрдЬрдирд╛, рдЬреЛ рд╣рдорд╛рд░реЗ рдЙрдкрдХрд░рдг рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреА рд╣реИ:
  1. рдЖрдЗрдП рдПрдХ рджреГрд╢реНрдп рдмрдирд╛рдПрдВ, рдЬрд┐рд╕ рдкрд░ рд╣рдо рдЧреНрд░рд╛рдлрд╝ рдмрдирд╛рдПрдВрдЧреЗ: рд╣рдо рдХреБрд▓реНрд╣рд╛рдбрд╝рд┐рдпреЛрдВ рдФрд░ рд╕рдордиреНрд╡рдп рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рд▓реЗрдмрд▓ рдмрдирд╛рддреЗ рд╣реИрдВред
  2. рдПрдХ рд╕рдордиреНрд╡рдп рдЧреНрд░рд┐рдб рдмрдирд╛рдПрдВ (рдФрд░ рдпрд╣рд╛рдВ рд╣рдо рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЧреНрд░рд╛рдлрд╝ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░реЗрдВрдЧреЗ)ред
  3. рдЕрдиреБрд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдЖрдЗрдЯрдо рдмрдирд╛рдПрдБред
  4. рдПрдХ рдХрд┐рдВрд╡рджрдВрддреА рдмрдирд╛рдПрдБред

рдкрд╣рд▓рд╛ рдЪрд░рдгред рдПрдХ рд░рдЪрдирд╛ рдмрдирд╛рдирд╛ред

рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
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()){ //TODO case when titleText too long } //Composite by height qreal dataHeight = rect.height() - 2*titleText->boundingRect().height() - 2*(abscissText->boundingRect().height()); if(dataHeight < 0.5*rect.height()){ //TODO decrease font size } titleText->setPos((rect.width()-titleText->boundingRect().width())/2.0, rect.y()); //Compose by width qreal dataWidth = rect.width()-2*ordinateText->boundingRect().height(); if(dataWidth< 0.5*rect.width()){ //TODO decrease font size } ordinateMainNocks->setPos(-ordinateMainNocks->boundingRect().width(), -5*ordinateMainNocks->font().pointSizeF()/4.0); m_sceneDataRect.setRect(rect.width()-dataWidth, 2*titleText->boundingRect().height() , dataWidth, dataHeight); abscissText->setPos( (dataWidth - abscissText->boundingRect().width())/2.0 + m_sceneDataRect.y(), rect.bottom() - abscissText->boundingRect().height()); ordinateText->setPos(0, (dataHeight - ordinateText->boundingRect().width())/2.0 + m_sceneDataRect.y()); calculateAndSetTransForm(); q_ptr->update() } 


рдЧреНрд░рд┐рдб рдмрдирд╛рдПрдВ


рдЕрдм рдЪрд▓реЛ рдЧреНрд░рд┐рдб рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╢реБрд░реВ рдореЗрдВ рдРрд╕рд╛ рд▓рдЧрддрд╛ рдерд╛ рдХрд┐ рд▓реЗрдмрд▓ рдХреЛ рд╕рдордиреНрд╡рдп рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЦреАрдВрдЪрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд░реВрдкрд░реЗрдЦрд╛ рдХреА рдШреЛрд╖рдгрд╛рддреНрдордХ рд╡рд┐рдЪрд╛рд░рдзрд╛рд░рд╛ рдХреЗ рд▓рд┐рдП рдХрд╛рдЙрдВрдЯрд░ рдЪрд▓рд╛рддрд╛ рд╣реИ: рдпрд╣ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдЗрдЯрдо рдХреЛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреИрд╕реЗ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдлрд┐рд░ рджреГрд╢реНрдп рдХреЛ рдмрддрд╛рдПрдВ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рд╣реА рддрд╕реНрд╡реАрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╕реЗрд░рд┐рдлрд╝ рдХреЗ рд▓реЗрдЖрдЙрдЯ рдХреЛ рд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдФрд░ рдЕрдм, рдЙрдирдХреЗ рдмрд┐рдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рд┐рд░реНрдл рдПрдХ рдЧреНрд░рд┐рдб рдмрдирд╛рддреЗ рд╣реИрдВред рд╣рдорд╛рд░рд╛ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░: рдЧреНрд░рд╛рдл рдбреЗрдЯрд╛ рдХреЗ рд╕рдорд╛рди рдкреИрдорд╛рдиреЗ рдкрд░ рдЧреНрд░рд┐рдб рдЗрдЯреЗрдо рдбреНрд░рд╛ рдХрд░реЗрдВ, рдФрд░ рдХреНрдпреВрдЯреА рдЕрдиреБрд╡рд╛рдж рдХреЛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рдХрд░реЗрдВред рдЕрдЧрд░ рдЕрдм рд╣рдо рдЧреНрд░рд╛рдл рдХреЛ рдЧреНрд░рд┐рдб рдЗрдЯреЗрдо рдХрд╛ рд╡рдВрд╢рдЬ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рд╣реИ:


рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
 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); // ordinateSecondaryNocks->setTransform(transform); abscissMainNocks->setTransform(transform); // abscissSecondaryNocks->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; //TODO   ,     if( count >0){ lines->resize(count); nocksList.reserve(count); double guidCoordinate; for(int i = 0; i< count; i++){ guidCoordinate = minValue+i*guides->step; lines->operator[](i) = QLineF(abscissRange.max, guidCoordinate, abscissRange.min, guidCoordinate); nocksList.append(new QGraphicsSimpleTextItem(QString::number(guidCoordinate))); nocksList.last()->setPos(abscissRange.min, guidCoordinate); } } else lines->clear(); } else lines->clear(); }; calculteLine(&ordinateMainLines, &(gridItem->ordinateMainLines.lines)); ordinateMainNocks->updateNocks(nocksList); calculteLine(&ordinateSecondaryLines, &(gridItem->ordinateSecondaryLines.lines)); ordinateSecondaryNocks->updateNocks(nocksList); } 



рдПрдХ рд╕реВрдХреНрд╖реНрдо рдмрд┐рдВрджреБ рд╣реИ: рдЬрдм рдЖрдк рд╣рдорд╛рд░реЗ рдЧреНрд░рд┐рдб рдЗрдЯреЗрдо рдХреА рдХреНрдпреВрдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо рдХреА рдорджрдж рд╕реЗ рдмрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдмреНрд░рд╢ рдХрд╛ рдЖрдХрд╛рд░ рднреА рдмрдврд╝рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдРрд╕рд╛ рди рд╣реЛ, рдЖрдкрдХреЛ рдХреЙрд╕реНрдореЗрдЯрд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпреВрдкреЗрди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
  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 рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕рдВрдХреЗрдд рдХреНрд▓рд╛рд╕ рдмреЙрдбреА рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдШреЛрд╖рд┐рдд рд╣реИрдВред рдпрд╛рдиреА рджреГрд╢реНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рд╣реЛрддреА рд╣реИ - рд╕рдВрдХреЗрддреЛрдВ рдФрд░ рд╕реНрд▓реЙрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред

рд╡рд┐рд╖рдп рдкрд░рд┐рдгрд╛рдо

рдФрд░ рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
  1. рдпрджрд┐ рдЖрдк рдврд╛рдВрдЪреЗ рдХреЗ рддрд░реНрдХ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдмрд╛рдзрд╛ рд░рд╣рд┐рдд рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╡рд┐рдХрд╛рд╕ред
  2. рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ рдШреЛрд╖рдгрд╛рддреНрдордХ рд╢реИрд▓реА рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдореБрдЦреНрдп рдХреЛрдб рд╕рд╛рд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рд╣рдж рддрдХ рдЪрд╛рд░реЛрдВ рдУрд░ рдиреГрддреНрдп рдХрд░рддрд╛ рд╣реИред
  3. рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЗрдЯрдо рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░реЛрд╕реНрдЯреЗрдЯ


Qwt рддреБрд▓рдирд╛ рдФрд░ рдЕрдВрд╢рд╛рдВрдХрдиред



рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдФрд░ рд╣рдорд╛рд░реА рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рд╕рдВрд╡реЗрджрдирд╛ рдХреЛ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдп рдХреА рдорд╛рддреНрд░рд╛ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ рдФрд░ рд╕рдореНрдорд╛рдирд┐рдд qw рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рд╣реИ:


рд╕рдВрджрд░реНрдн


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг ред
рд╡реАрдбрд┐рдпреЛ , рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдПрдХ рдСрдл рд╕рд╛рдЗрдЯ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ youtube рдкрд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ
рдкреНрд░реЛрдЬреЗрдХреНрдЯ ред

рдкреБрдирд╢реНрдЪ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХ рдбреЗрдореЛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреАрдбрд╝реЗ рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдпрд╛ рдЬреЛ рд╕реБрдзрд╛рд░ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗ, рддреЛ рдореБрдЭреЗ рдХреЗрд╡рд▓ рдЦреБрд╢реА рд╣реЛрдЧреАред
PPS рдЬрд╕реНрдЯ рдХреЗрд╕ рдореЗрдВ: CC-BY 3.0 рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рддрд╣рдд рдкреНрд░рдХрд╛рд╢рд┐рдд рдЯреЗрдХреНрд╕реНрдЯ

UPD рдЖрдзрд╛ рдкреНрд░рдпрд╛рд╕ рдкрд░рд┐рдгрд╛рдо:

Source: https://habr.com/ru/post/In182142/


All Articles