Qt繪製自定義箭頭圖元
#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
相關文章
- Qt畫箭頭QT
- QT風格(QStyle):繪製一個自定義QComboBoxQT
- flutter 用 CustomPaint 繪製自定義圖案FlutterAI
- canvas繪製箭頭效果程式碼例項Canvas
- Flutter自定義繪製(1)- 繪製基礎Flutter
- Flutter 自定義繪製 ViewFlutterView
- flutter 自定義view 繪製曲線統計圖FlutterView
- Qt之自繪製餅圖QT
- 箭頭→箭頭 matlab畫圖Matlab
- canvas 奇巧淫技(二)繪製箭頭路徑效果Canvas
- 自定義View實現箭頭沿圓轉動View
- Flutter自定義繪製Widget初探Flutter
- 自定義控制元件之kotlin繪製折線圖和曲線圖控制元件Kotlin
- Anroid自定義View-繪製圓環View
- 如何在 Matlab 中繪製帶箭頭的座標系Matlab
- 永宏BI 自定義繪圖(環狀圖)繪圖
- 使用joinjs繪製流程圖(六)-自定義節點成html元素JS流程圖HTML
- 自定義View的繪製流程基礎分析View
- Android 自定義 View 繪圖基礎AndroidView繪圖
- 類圖各個箭頭和符號的含義符號
- WPS演示教程:妙用自定義動畫輕鬆繪製城市輪廓圖動畫
- 不如你把我殺了吧 | 繪製自定義的 3D 地圖3D地圖
- qt中設定tab樣式為箭頭QT
- 安卓自定義View進階:繪製基本形狀安卓View
- 自定義提醒檢視Alert-動態繪製
- 動畫函式的繪製及自定義動畫函式動畫函式
- Android自定義View之Paint繪製文字和線AndroidViewAI
- QT繪製簡易錶盤QT
- 安卓學習筆記31:使用自定義檢視繪製文字、圖形與影像安卓筆記
- 【Android自定義View】繪圖之文字篇(三)AndroidView繪圖
- 【Android自定義View】繪圖之Path篇(二)AndroidView繪圖
- Qt Charts 自定義樣式QT
- C++ Qt開發:Charts折線圖繪製詳解C++QT
- 例項QT程式 —— Qt自繪製小時鐘QT
- qt之點的繪製示例demoQT
- 自定義ImageView完成圓形頭像自定義View
- C++ Qt開發:Charts繪製各類圖表詳解C++QT
- [-Flutter 自定義元件-] 蛛網圖+繪製+動畫實踐Flutter元件動畫