{"id":182142,"date":"2013-06-06T17:07:05","date_gmt":"2013-06-06T13:07:05","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=182142"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=182142","title":{"rendered":"<span class=\"post_title\">\u041a\u0440\u0430\u0441\u043e\u0442\u0430 \u0438 \u043c\u043e\u0449\u044c Qt Graphics View Framework \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t\u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 Qt Graphics Scene FrameWork \u2014 \u043c\u043e\u0449\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043d\u0435\u0437\u0430\u0441\u043b\u0443\u0436\u0435\u043d\u043d\u043e \u043e\u0431\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435\u043c \u043d\u0430 \u0425\u0430\u0431\u0440\u0435. \u042f \u043f\u043e\u043f\u044b\u0442\u0430\u044e\u0441\u044c \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043f\u043e\u0441\u0432\u044f\u0442\u0438\u0432 \u0435\u043c\u0443 \u0446\u0438\u043a\u043b \u0441\u0442\u0430\u0442\u0435\u0439. \u0418 \u0432 \u044d\u0442\u043e\u0439, \u043f\u0438\u043b\u043e\u0442\u043d\u043e\u0439, \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u043a\u0430\u0436\u0443 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.<br \/>  <a name=\"habracut\"><\/a><br \/>  \u0418 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0430\u043a\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u044f \u0432\u044b\u0431\u0440\u0430\u043b \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432. \u0412 \u043d\u0435\u0439 \u0435\u0441\u0442\u044c \u0432\u0441\u0435:  <\/p>\n<ul>\n<li>\u0420\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0432\u0438\u0434\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432: \u043a\u0430\u043a \u0442\u0435\u043a\u0441\u0442, \u0442\u0430\u043a \u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u0432<\/li>\n<li> \u0417\u0430\u0434\u0430\u0447\u0430 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438: \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a, \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u043a \u043e\u0441\u044f\u043c, \u043d\u0443 \u0438 \u0441\u0430\u043c\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043d\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0441 \u0433\u0440\u0430\u0444\u0438\u043a\u0430\u043c\u0438 <\/li>\n<li>\u0417\u0430\u0434\u0430\u0447\u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0438\u0437 \u043e\u0434\u043d\u0438\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432 \u0434\u0440\u0443\u0433\u0443\u044e: \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043e\u0442\u0441\u0447\u0435\u0442\u0430, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0432 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u0443\u044e<\/li>\n<li>\u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438: \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u043b\u0435\u0433\u0435\u043d\u0434\u0443.<\/li>\n<\/ul>\n<p>  \u0421\u0440\u0430\u0437\u0443 \u043e\u0433\u043e\u0432\u043e\u0440\u044e\u0441\u044c, \u0447\u0442\u043e \u043d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0444\u0438\u0448\u043a\u0438. \u041f\u043e\u043b\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e, \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u0443 \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0432\u0437\u044f\u0442\u044c <a href=\"http:\/\/github.com\/DancingOnWater\/GraphicsScenePlot\">\u0437\u0434\u0435\u0441\u044c<\/a>.<br \/>  \u041f\u0435\u0440\u0432\u043e\u0435 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0443\u0436\u0435 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0418\u0442\u0430\u043a, \u043f\u043b\u0430\u043d \u0440\u0430\u0431\u043e\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0434 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043d\u0430\u0448\u0435\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430:  <\/p>\n<ol>\n<li>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0446\u0435\u043d\u0443, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u043c \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u043a\u0438: \u0441\u043a\u043e\u043c\u043f\u043e\u043d\u0443\u0435\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u043a \u043e\u0441\u044f\u043c \u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043d\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c. <\/li>\n<li>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043d\u0443\u044e \u0441\u0435\u0442\u043a\u0443 (\u0418 \u0437\u0434\u0435\u0441\u044c \u0440\u0435\u0448\u0438\u043c, \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u0441 \u0433\u0440\u0430\u0444\u0438\u043a\u0430\u043c\u0438).<\/li>\n<li>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c Item \u0434\u043b\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u0430.<\/li>\n<li>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043b\u0435\u0433\u0435\u043d\u0434\u0443.<\/li>\n<\/ol>\n<p>  <\/p>\n<h5>\u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u0442\u0430\u043f. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438.<\/h5>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">class GraphicsPlotNocksTube : public QGraphicsItem { public:     GraphicsPlotNocksTube(QGraphicsItem *parent): QGraphicsItem(parent){}     void updateNocks(const QList&lt;QGraphicsSimpleTextItem*&gt;& nocks);     QRectF boundingRect()const {return m_boundRect;}     void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *){}     inline const QFont &font(){return m_NocksFont;} private:     QList&lt;QGraphicsSimpleTextItem*&gt; 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&lt;QLineF&gt; 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-&gt;setPen(m_mainPen);     painter-&gt;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); }; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041a\u043e\u043c\u043f\u043e\u043d\u0443\u0435\u043c:<\/p>\n<pre><code class=\"cpp\">void GraphicsPlotItemPrivate::compose() {     titleText-&gt;setFont(titleFont);         abscissText-&gt;setFont(abscissFont);     if(titleText-&gt;boundingRect().width() &gt; rect.width()){         \/\/TODO case when titleText too long     }      \/\/Composite by height     qreal dataHeight = rect.height() - 2*titleText-&gt;boundingRect().height() - 2*(abscissText-&gt;boundingRect().height());     if(dataHeight &lt; 0.5*rect.height()){         \/\/TODO decrease font size     }      titleText-&gt;setPos((rect.width()-titleText-&gt;boundingRect().width())\/2.0, rect.y());      \/\/Compose by width     qreal dataWidth = rect.width()-2*ordinateText-&gt;boundingRect().height();     if(dataWidth&lt; 0.5*rect.width()){         \/\/TODO decrease font size     }     ordinateMainNocks-&gt;setPos(-ordinateMainNocks-&gt;boundingRect().width(), -5*ordinateMainNocks-&gt;font().pointSizeF()\/4.0);      m_sceneDataRect.setRect(rect.width()-dataWidth, 2*titleText-&gt;boundingRect().height() , dataWidth, dataHeight);      abscissText-&gt;setPos( (dataWidth - abscissText-&gt;boundingRect().width())\/2.0 + m_sceneDataRect.y(), rect.bottom() - abscissText-&gt;boundingRect().height());         ordinateText-&gt;setPos(0, (dataHeight - ordinateText-&gt;boundingRect().width())\/2.0 + m_sceneDataRect.y());     calculateAndSetTransForm();     q_ptr-&gt;update() } <\/code><\/pre>\n<h5>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043d\u043e\u0439 \u0441\u0435\u0442\u043a\u0438<\/h5>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0435\u0442\u043a\u0438. \u041d\u0430\u0434\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043c\u0435\u0442\u043a\u0438 \u043d\u0430\u0434\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043d\u044b\u043c\u0438 \u043b\u0438\u043d\u0438\u044f\u043c\u0438. \u041e\u0434\u043d\u0430\u043a\u043e \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0438\u0434\u0435\u0442 \u0432\u0440\u0430\u0437\u0440\u0435\u0437 \u0441 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0438\u0434\u0435\u043e\u043b\u043e\u0433\u0438\u0435\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430: \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a \u0432 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c item, \u0430 \u0437\u0430\u0442\u0435\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0446\u0435\u043d\u0435 \u043a\u0430\u043a \u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441 \u043d\u0438\u043c \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u0442\u044c, \u0438 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0432 \u043b\u044e\u0431\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445. \u0418 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0432\u0435\u0440\u0441\u0442\u043a\u0430 \u0437\u0430\u0441\u0435\u0447\u0435\u043a \u0431\u044b\u043b\u0430 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0435\u043d\u0430 \u0432 compose. <\/p>\n<p>  \u0410 \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u043a\u0430 \u043e\u0431\u043e\u0439\u0434\u0435\u043c\u0441\u044f \u0431\u0435\u0437 \u043d\u0438\u0445 \u0438 \u043d\u0430\u0440\u0438\u0441\u0443\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043d\u0443\u044e \u0441\u0435\u0442\u043a\u0443. \u041d\u0430\u0448\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f: gridItem \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0432 \u0442\u043e\u0439 \u0436\u0435 \u0448\u043a\u0430\u043b\u0435, \u0447\u0442\u043e \u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432, \u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c \u0432 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043f\u0443\u0441\u0442\u044c \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f Qt. \u0415\u0441\u043b\u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0433\u0440\u0430\u0444\u0438\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u0442\u043e\u043c\u043a\u043e\u043c gridItem, \u0442\u043e \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0433\u043e\u0442\u043e\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435:  <\/p>\n<ul>\n<li>\u041d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u043d\u0438\u0438 \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u0432 \u0448\u043a\u0430\u043b\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u041e\u043d\u0438 \u0441\u0430\u043c\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u044f\u0442\u0441\u044f \u0432 \u043d\u0443\u0436\u043d\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c, \u0430 \u0435\u0441\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c\n<pre><code class=\"cpp\">gridItem-&gt;setFlag(QGraphicsItem::ItemClipsChildrenToShape)<\/code><\/pre>\n<p>\u0442\u043e \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043a\u0430\u0434\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u0430<\/li>\n<li>\u0412\u0441\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0441\u0446\u0435\u043d\u044b (\u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b \u0438\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043c\u044b\u0448\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0448\u043a\u0430\u043b\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0442\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0438\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443.<\/li>\n<\/ul>\n<p>  \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f:  <\/p>\n<pre><code class=\"cpp\">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-&gt;setPen(m_mainPen);     painter-&gt;drawRect(m_rect); }  void Graphics2DPlotGrid::paintAxeGuidLines(const AxisGuideLines& axe, QPainter *painter, const QPen &linePen) {     if(axe.showLines){         painter-&gt;setPen(linePen);         painter-&gt;drawLines(axe.lines);     } } void GraphicsPlotItemPrivate::calculateAndSetTransForm() {     double  scaleX = m_sceneDataRect.width()\/gridItem-&gt;rect().width();         double scaleY = m_sceneDataRect.height()\/gridItem-&gt;rect().height();     QTransform transform = QTransform::fromTranslate( - gridItem-&gt;rect().x()*scaleX + m_sceneDataRect.x(), - gridItem-&gt;rect().y()*scaleY +m_sceneDataRect.y());         transform.scale(scaleX, -scaleY);     gridItem-&gt;setTransform(transform);     ordinateMainNocks-&gt;setTransform(transform); \/\/        ordinateSecondaryNocks-&gt;setTransform(transform);     abscissMainNocks-&gt;setTransform(transform); \/\/    abscissSecondaryNocks-&gt;setTransform(transform); } <\/code><\/pre>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u0435\u0442\u043a\u0443<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">void GraphicsPlotItemPrivate::calculateOrdinateGrid() {     const QRectF  r = gridItem-&gt;boundingRect();     if(fabs(r.width()) &lt; std::numeric_limits&lt;float&gt;::min()*5.0 || fabs(r.height()) &lt; std::numeric_limits&lt;float&gt;::min()*5.0)         return;     QList&lt;QGraphicsSimpleTextItem*&gt; nocksList;      auto calculteLine = [&] (AxisGuideLines* guides, QVector&lt;QLineF&gt; *lines)     {         int k;         double minValue;         int count;          nocksList.clear();         if(fabs(guides-&gt;step) &gt; std::numeric_limits&lt;double&gt;::min()*5.0 )         {             k = (ordinateRange.min - guides-&gt;baseValue)\/guides-&gt;step;             minValue = k*guides-&gt;step+guides-&gt;baseValue;             count = (ordinateRange.max - minValue)\/guides-&gt;step;              \/\/TODO \u0434\u043e\u0434\u0443\u043c\u0430\u0442\u044c \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0430\u044f \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u0430             if( count &gt;0){                 lines-&gt;resize(count);                 nocksList.reserve(count);                 double guidCoordinate;                 for(int i = 0; i&lt; count; i++){                     guidCoordinate = minValue+i*guides-&gt;step;                     lines-&gt;operator[](i) = QLineF(abscissRange.max, guidCoordinate, abscissRange.min, guidCoordinate);                     nocksList.append(new QGraphicsSimpleTextItem(QString::number(guidCoordinate)));                     nocksList.last()-&gt;setPos(abscissRange.min, guidCoordinate);                 }             }             else                 lines-&gt;clear();         }         else             lines-&gt;clear();     };     calculteLine(&ordinateMainLines, &(gridItem-&gt;ordinateMainLines.lines));     ordinateMainNocks-&gt;updateNocks(nocksList);         calculteLine(&ordinateSecondaryLines, &(gridItem-&gt;ordinateSecondaryLines.lines));         ordinateSecondaryNocks-&gt;updateNocks(nocksList); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0422\u0443\u0442 \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u0442\u043e\u043d\u043a\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: \u043f\u0440\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e QTransform \u043d\u0430\u0448\u0435\u0433\u043e gridItem \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0438\u0441\u0442\u0438 \u0442\u043e\u0436\u0435 \u0440\u0430\u0441\u0442\u0435\u0442, \u0447\u0442\u043e\u0431 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u0434\u0430\u0442\u044c QPen \u043a\u0430\u043a cosmetic:  <\/p>\n<pre><code class=\"cpp\">    m_secondaryPen.setCosmetic(true);     m_mainPen.setCosmetic(true); <\/code><\/pre>\n<h5>Item \u0433\u0440\u0430\u0444\u0438\u043a\u0430<\/h5>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">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&lt;double&gt; absciss, QList&lt;double&gt; ordinate);     void setData(QVector&lt;double&gt; absciss, QVector&lt;double&gt; ordinate);      QRectF boundingRect() const;     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); private:     Q_DECLARE_PRIVATE(Graphics2DGraphItem)     Graphics2DGraphItemPrivate *d_ptr; }; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u0447\u0440\u0435\u0437\u0432\u044b\u0447\u0430\u0439\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0438 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u044b\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u043d\u0438\u0446 boundRect.  <\/p>\n<pre><code class=\"cpp\">class Graphics2DGraphItemPrivate {     Q_DECLARE_PUBLIC(Graphics2DGraphItem)     Graphics2DGraphItem *q_ptr;     Graphics2DGraphItemPrivate(Graphics2DGraphItem *parent):q_ptr(parent){}     QVector&lt;QLineF&gt; m_lines;     template&lt;typename T&gt; void setData(T absciss, T ordinate, qint32 length)     {         q_ptr-&gt;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 &lt; length; ++i)         {             if(ordinate[i+1] &gt; ordinateRange.max)                 ordinateRange.max = ordinate[i+1];             else if(ordinate[i+1] &lt; ordinateRange.min )                 ordinateRange.min = ordinate[i+1];             if(absciss[i+1] &gt; abscissRange.max)                 abscissRange.max = absciss[i+1];             else if(absciss[i+1] &lt; 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-&gt;setOrdinateRange(ordinateRange.min, ordinateRange.max);             q_ptr-&gt;setAbscissRange(abscissRange.min, abscissRange.max);         q_ptr-&gt;update();         QMetaObject::invokeMethod(q_ptr, &quot;dataItemChange&quot;);     }      QRect m_boundRect; };  QRectF Graphics2DGraphItem::boundingRect() const {     return d_ptr-&gt;m_boundRect; }  void Graphics2DGraphItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {     Q_UNUSED(option)     Q_UNUSED(widget)     painter-&gt;setBrush(brush());     painter-&gt;setPen(pen());     painter-&gt;drawLines(d_ptr-&gt;m_lines); } <\/code><\/pre>\n<h5>\u041b\u0435\u0433\u0435\u043d\u0434\u0430 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/h5>\n<p>  \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043e\u043d\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0435\u0441\u043b\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e <i>GraphicsDataItem<\/i> \u043e\u0442\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d \u043e\u0442 <i>QGraphicsObject<\/i> \u0438 \u0447\u0442\u043e \u0432 \u0442\u0435\u043b\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u0443\u0436\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u044b \u0441\u0438\u0433\u043d\u0430\u043b\u044b. \u0422.\u0435. \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u0441\u0446\u0435\u043d\u044b \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u2014 \u0447\u0435\u0440\u0435\u0437 \u0441\u0438\u0433\u043d\u0430\u043b\u044b \u0438 \u0441\u043b\u043e\u0442\u044b.<\/p>\n<h5>\u0421\u0443\u0431\u044a\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0438\u0442\u043e\u0433<\/h5>\n<p>  \u0410 \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0432 \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435?  <\/p>\n<ol>\n<li>\u0411\u0435\u0441\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b, \u0435\u0441\u043b\u0438 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430.<\/li>\n<li>\u0412\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0432 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u0442\u0438\u043b\u0435 \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u0434 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u0441\u0443\u0442\u0438 \u0438 \u0432 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043c\u0435\u043d\u044c\u0448\u0435\u0439 \u043c\u0435\u0440\u0435 \u043a \u043f\u043b\u044f\u0441\u043a\u0430\u043c \u0432\u043e\u043a\u0440\u0443\u0433.<\/li>\n<li>\u041f\u0440\u043e\u0441\u0442\u0430\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f item-\u043e\u0432 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445<\/li>\n<\/ol>\n<h4>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0438 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0430 \u043f\u043e qwt. <\/h4>\n<p>  \u0427\u0442\u043e\u0431 \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043c \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043c\u0430 \u0440\u0430\u0431\u043e\u0442, \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430\u043c\u0438 \u0438 \u0442\u0435\u043c, \u0447\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 qwt:  <\/p>\n<ul>\n<li> \u041f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u0431\u0440\u043e\u0441\u0430\u0435\u0442\u0441\u044f \u0432 \u0433\u043b\u0430\u0437\u0430 \u2014 \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0435 \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0438 \u0432 drawItem. \u041d\u0430\u0448\u0438 \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043a\u043e\u0440\u043e\u0447\u0435. \u041d\u0430\u043c \u043d\u0435 \u043d\u0430\u0434\u043e \u0437\u0430\u0431\u043e\u0442\u0438\u0442\u044c\u0441\u044f \u043e\u0431 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0447\u043b\u0435\u043d\u0430. \u041c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0438 \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u2014 \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u0434\u0430\u0435\u043c viewport..<\/li>\n<li>\u041a\u0443\u0447\u0430 \u0442\u0440\u0443\u0434\u043e\u0432 \u0432\u043b\u043e\u0436\u0435\u043d\u043e \u0432 QwtLegendData, QwtLegendLabel, QwtPainter, QwtPainterCommand, QwtPlotDirectPainter \u0438 \u0442.\u0434. \u041c\u044b \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u043b\u0438 \u0438 \u043d\u0435 \u044f\u0441\u043d\u044b \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u0437\u0430\u0447\u0435\u043c \u0432 \u043d\u0430\u0448\u0435\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0432\u0441\u0435 \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c.<\/li>\n<li>\u041d\u0430\u043c \u043d\u0435 \u043d\u0430\u0434\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043a\u043b\u0430\u0441\u0441\u044b \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0438 \u043f\u0435\u0440\u0435\u0441\u0447\u0435\u0442\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432 \u0434\u0440\u0443\u0433\u0443\u044e, \u0438 \u043d\u0430\u043c \u043d\u0435 \u043d\u0430\u0434\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442.<\/li>\n<li>\u041c\u044b \u0434\u043e\u0431\u0438\u043b\u0438\u0441\u044c \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 iem-\u043e\u0432 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/li>\n<li>\u041d\u0430\u0448\u0430 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043f\u0440\u043e\u0449\u0435. \u0418 \u043f\u0440\u0438 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0438 \u043d\u0435 \u0432\u0438\u0434\u043d\u043e \u043f\u0440\u0438\u0447\u0438\u043d, \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u0442\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435. <\/li>\n<\/ul>\n<h4>\u0421\u0441\u044b\u043b\u043a\u0438<\/h4>\n<p>  <a href=\"http:\/\/qt-project.org\/doc\/qt-5.0\/qtwidgets\/graphicsview.html\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a>, \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u0430\u044f \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438.<br \/>  <a href=\"http:\/\/qt-project.org\/videos#c-85\">\u0412\u0438\u0434\u0435\u043e<\/a>, \u0435\u0441\u043b\u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0441 \u043e\u0444\u0444 \u0441\u0430\u0439\u0442\u0430, \u0442\u043e \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043d\u0430 youtube<br \/>  <a href=\"http:\/\/github.com\/DancingOnWater\/GraphicsScenePlot\">\u041f\u0440\u043e\u0435\u043a\u0442<\/a>.<\/p>\n<p>  P.S. \u041f\u0440\u043e\u0435\u043a\u0442 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439, \u043d\u043e \u0435\u0441\u043b\u0438 \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u0439\u0434\u0435\u043d\u044b \u0431\u0430\u0433\u0438, \u0438\u043b\u0438 \u043a\u0442\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0441 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435\u043c \u2014 \u0431\u0443\u0434\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0434.<br \/>  <sub> P.P.S \u041d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439: \u0442\u0435\u043a\u0441\u0442 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d \u043f\u043e\u0434 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0435\u0439 CC-BY 3.0<\/sub>    \t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/182142\/\"> http:\/\/habrahabr.ru\/post\/182142\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t\u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 Qt Graphics Scene FrameWork \u2014 \u043c\u043e\u0449\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043d\u0435\u0437\u0430\u0441\u043b\u0443\u0436\u0435\u043d\u043d\u043e \u043e\u0431\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435\u043c \u043d\u0430 \u0425\u0430\u0431\u0440\u0435. \u042f \u043f\u043e\u043f\u044b\u0442\u0430\u044e\u0441\u044c \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043f\u043e\u0441\u0432\u044f\u0442\u0438\u0432 \u0435\u043c\u0443 \u0446\u0438\u043a\u043b \u0441\u0442\u0430\u0442\u0435\u0439. \u0418 \u0432 \u044d\u0442\u043e\u0439, \u043f\u0438\u043b\u043e\u0442\u043d\u043e\u0439, \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u043a\u0430\u0436\u0443 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-182142","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/182142","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=182142"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/182142\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=182142"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=182142"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=182142"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}