我有我自己的類型QGraphicsLineItem的派生類,其中我重寫paint()以將其呈現爲箭頭。查找QGraphicsItem的大綱
我的測試線是160,130,260,230
我的paint()方法實現:
void MyQGraphicsLineItem::paint(QPainter* aPainter, const QStyleOptionGraphicsItem* aOption, QWidget* aWidget /*= nullptr*/)
{
Q_UNUSED(aWidget);
aPainter->setClipRect(aOption->exposedRect);
// Get the line and its angle
QLineF cLine = line();
const qreal cLineAngle = cLine.angle();
// Create two copies of the line
QLineF head1 = cLine;
QLineF head2 = cLine;
// Shorten each line and set its angle relative to the main lines angle
// this gives up the "arrow head" lines
head1.setLength(12);
head1.setAngle(cLineAngle+-32);
head2.setLength(12);
head2.setAngle(cLineAngle+32);
// Draw shaft
aPainter->setPen(QPen(Qt::black, 1, Qt::SolidLine));
aPainter->drawLine(cLine);
// Draw arrow head
aPainter->setPen(QPen(Qt::red, 1, Qt::SolidLine));
aPainter->drawLine(head1);
aPainter->setPen(QPen(Qt::magenta, 1, Qt::SolidLine));
aPainter->drawLine(head2);
}
這繪製了一個箭頭,看起來像這樣:
我想要做的是能夠計算這個項目的「輪廓」,以便我可以從數據中繪製一個填充的QPolygon。
我不能使用任何快捷方式,例如用不同的筆寬度繪製兩條線,因爲我希望輪廓是動畫「虛線」(又名遊行螞蟻)。
我敢肯定,這是簡單的計算,但我的數學技能是非常糟糕 - 我試圖做創建平行線以下:
- 商店的線的角度。
- 將角度設置爲0.
- 複製線條。
- 在副本上使用QLineF :: translate()。
- 將兩個線的角度都設置回您存儲在1中的值 - 這會導致每行的開始和結束位置未對齊。
希望有人可以把我放在正確的軌道上,從這條線上創建一個厚的QPolygonF(或其他任何有意義的),然後可以有一個輪廓和填充設置爲繪畫。
另外我打算在我的場景中有1000個這樣的理想情況,我也想要一個解決方案,它不會花費太多的執行時間或者有一個簡單的優化方法。
這裏這張圖片就是我試圖實現 - 想象中的紅線是Qt的虛線,而不是在畫是我非常糟糕MSPAINT嘗試!
你是天才!感謝名單。現在我可以更簡潔地繪製我的箭頭,並用鼠標點擊它們! – 2016-06-24 21:46:10