如何使用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();
}
答案 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并重新绘制它。
希望有所帮助。