跟踪Qt中图形视图中的折线

时间:2014-07-14 13:17:20

标签: c++ qt

如何使用Qt中的QPainter类在图形视图中跟踪多段线和样条曲线?我粘贴了我的代码。请检查并编辑。我点击按钮生成折线。 polyline.h

#include <QGraphicsSceneMouseEvent>
#include <QMouseEvent>
#include <QDebug>
#include "ui_mainwindow.h"
#include "qmath.h"

class polyline: public QObject, public QGraphicsItem
{
     Q_OBJECT
public:
    polyline();
    QRectF boundingRect() const;
    virtual void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget);
protected:
    void mousePressEvent(QGraphicsSceneMouseEvent *e);
    void mouseMoveEvent(QGraphicsSceneMouseEvent *e);
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *e);
private:
    int x1, y1, x2, y2, w, h;
    bool mFirstClick;
    bool mSecondClick;
    bool mPaintFlag;
    QVector<QPointF> stuff;
};

#endif // POLYLINE_H

polyline.cpp

 #include "polyline.h"
#include "QDebug"

polyline::polyline()
{
    mFirstClick = true;
    mSecondClick = false;
    mPaintFlag = false;
}
QRectF polyline::boundingRect() const
{
    // outer most edges
    return QRectF(0,0,800,800);
}

    void polyline::mousePressEvent(QGraphicsSceneMouseEvent* e){
        if(e->button()==Qt::LeftButton) {
            if(mFirstClick){
                x1 = e->pos().x();
                y1 = e->pos().y();
                mFirstClick = false;
                mSecondClick = true;
            }

            else if(!mFirstClick && mSecondClick){
                x2 = e->pos().x();
                y2 = e->pos().y();
                mPaintFlag = true;
                mSecondClick = false;
                update();
            }
        }
        QGraphicsItem::mousePressEvent(e);
        update();
    }
    void polyline:: paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){
        QRectF rect = boundingRect();
        if(mPaintFlag){
            QPen paintpen(Qt::red);
            paintpen.setWidth(4);

            QPen linepen(Qt::black);
            linepen.setWidth(1);

            QPoint p1;
            p1.setX(x1);
            p1.setY(y1);

            painter->setPen(paintpen);
            painter->drawPoint(p1);

            QPoint p2;
            p2.setX(x2);
            p2.setY(y2);

            painter->setPen(paintpen);
            painter->drawPoint(p2);

            painter->setPen(linepen);
            painter->drawLine(p1, p2);
        }
    }
    void polyline::mouseMoveEvent(QGraphicsSceneMouseEvent *e)
    {

            m_pCurrentLine->setx2(e->x());
            m_pCurrentLine->sety2(e->y());

            m_pCurrentLine->update();

        }
        QGraphicsItem::mouseMoveEvent(e);
    }

    void  polyline::mouseReleaseEvent(QGraphicsSceneMouseEvent *e)
    {
        QGraphicsItem::mouseReleaseEvent(e);
        update();
    }

1 个答案:

答案 0 :(得分:0)

创建自己的从QGraphicsView派生的类并重新实现mouseMoveEvent:

void OwnGraphicsView::mouseMoveEvent(QMouseEvent *event)
{
    m_pCurrentLine->setX2(event->x());
    m_pCurrentLine->setY2(event->y());

    m_pCurrentLine->update();
}

使用GraphicsView为Widget设置鼠标跟踪:

setMouseTracking(true);

创建一个派生自QGraphicsItem的Item,例如一个类“line”并重新实现绘制方法:

void line:: paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)

因此,每次调用mouseMoveEvent时,请更新行Coordinates并重新绘制它。

希望有所帮助。