#ifndef LINK_H
#define LINK_H
#include <QGraphicsItem>
class Link : public QObject,public QGraphicsItem
{
Q_OBJECT
Q_INTERFACES(QGraphicsItem)
public:
explicit Link(QObject *parent = 0);
virtual QRectF boundingRect() const;
virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
void setLineItem(QPointF startP, QPointF endP);
void setColor(QColor color);
private:
void CreatePointNodes(void);
private:
QPointF m_EndP;//这个点是直线的终点
QPointF m_points[3];//箭头端的三个端点
QColor m_Color;
};
#endif // LINK_H
#include "link.h"
#include "math.h"
#include <QPainter>
Link::Link(QObject *parent) : QObject(parent)
{
//setFlag(ItemIsMovable);
setFlag(ItemIsSelectable);
setAcceptHoverEvents(true);
m_Color = Qt::green;
}
QRectF Link::boundingRect() const
{
return QRectF(0, 0, m_EndP.x(), m_EndP.y());
}
void Link::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
painter->setRenderHint(QPainter::Antialiasing, true); //设置反走样,防锯齿
QPen pen(m_Color, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
QBrush brush(m_Color, Qt::SolidPattern);
painter->setPen(pen);
painter->setBrush(brush);
QLineF line(0, 0, m_EndP.x(), m_EndP.y());
painter->drawLine(line);
painter->drawPolygon(m_points, 3);
/* pen.setWidth(1);
painter->setPen(pen);
brush.setColor(QColor(0,0,0,0));
painter->setBrush(brush);
painter->drawRect(boundingRect());
*/
}
void Link::setLineItem(QPointF startP, QPointF endP)
{
m_EndP = endP - startP;
CreatePointNodes();
}
void Link::setColor(QColor color)
{
m_Color = color;
}
void Link::CreatePointNodes(void)
{
//箭头直线与水平方向的夹角再加pi
float angle = atan2(m_EndP.y(), m_EndP.x()) + 3.1415926;
//这两个值需要根据实际场景的坐标大小进行调整,
float ExtRefArrowLenght = 20;//箭头末端大小的长度,
float ExtRefArrowDegrees = 0.3;//箭头末端顶角的一半
m_points[0] = m_EndP;
//求得箭头点1坐标
m_points[1].setX(m_EndP.x() + ExtRefArrowLenght * cos(angle - ExtRefArrowDegrees));
m_points[1].setY(m_EndP.y() + ExtRefArrowLenght * sin(angle - ExtRefArrowDegrees));
//求得箭头点2坐标
m_points[2].setX(m_EndP.x() + ExtRefArrowLenght * cos(angle + ExtRefArrowDegrees));
m_points[2].setY(m_EndP.y() + ExtRefArrowLenght * sin(angle + ExtRefArrowDegrees));
}
调用方式如下,需要在头文件中声明一个link指针,如果需要图元根据端点坐标的变化实时更新位置,可以通过设置link
(图元名字)的setLineItem()函数和setPos()函数。
//通过这个调用,添加图元
link = new Link(this);
link->setLineItem(startP, endP);
link->setPos(startP);
this->_scene->addItem(link);
转载自:https://blog.csdn.net/u012061464/article/details/80571328