QT中QGraphicsItem 獲取點(diǎn)坐標(biāo)的幾種方法
在 Qt 圖形視圖框架中,從 QGraphicsItem(特別是點(diǎn)圖元)獲取坐標(biāo)有多種方式,取決于你需要的是場(chǎng)景坐標(biāo)、視圖坐標(biāo)還是圖元自身的局部坐標(biāo)。
1. 獲取圖元在場(chǎng)景中的位置
對(duì)于 QGraphicsEllipseItem(點(diǎn)圖元)
// 假設(shè) item 是你的 QGraphicsEllipseItem 指針
if (QGraphicsEllipseItem* pointItem = qgraphicsitem_cast<QGraphicsEllipseItem*>(item)) {
// 獲取圖元中心點(diǎn)在場(chǎng)景中的坐標(biāo)
QPointF scenePos = pointItem->scenePos();
// 或者獲取包圍矩形的中心
QRectF rect = pointItem->rect();
QPointF centerInItem = rect.center();
QPointF centerInScene = pointItem->mapToScene(centerInItem);
qDebug() << "場(chǎng)景坐標(biāo):" << scenePos;
qDebug() << "精確中心坐標(biāo):" << centerInScene;
}2. 從 QMap<int, QGraphicsEllipseItem*> 獲取所有點(diǎn)坐標(biāo)
QMap<int, QGraphicsEllipseItem*> pointMap; // 你的點(diǎn)圖元容器
// 遍歷獲取所有點(diǎn)坐標(biāo)
for (auto it = pointMap.constBegin(); it != pointMap.constEnd(); ++it) {
int id = it.key();
QGraphicsEllipseItem* item = it.value();
QPointF scenePos = item->scenePos();
QRectF rect = item->rect();
QPointF center = item->mapToScene(rect.center());
qDebug() << "點(diǎn)ID:" << id << "場(chǎng)景坐標(biāo):" << center;
// 如果需要視圖坐標(biāo)(像素坐標(biāo))
QPoint viewPos = mGraphicsView->mapFromScene(center);
qDebug() << "視圖坐標(biāo):" << viewPos;
}3. 響應(yīng)點(diǎn)擊事件獲取坐標(biāo)
// 在場(chǎng)景子類中重寫(xiě)鼠標(biāo)事件
void MyGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent* event) {
QGraphicsScene::mousePressEvent(event); // 先讓基類處理選擇邏輯
// 獲取點(diǎn)擊位置的圖元
QGraphicsItem* item = itemAt(event->scenePos(), QTransform());
if (item && (item->type() == QGraphicsEllipseItem::Type)) {
QGraphicsEllipseItem* ellipse = static_cast<QGraphicsEllipseItem*>(item);
QPointF center = ellipse->mapToScene(ellipse->rect().center());
qDebug() << "點(diǎn)擊了點(diǎn)圖元,中心坐標(biāo):" << center;
}
}4. 獲取選中點(diǎn)的坐標(biāo)
// 獲取當(dāng)前選中的所有點(diǎn)圖元坐標(biāo)
QList<QPointF> getSelectedPointsCoordinates() {
QList<QPointF> coordinates;
foreach (QGraphicsItem* item, mScene->selectedItems()) {
if (item->type() == QGraphicsEllipseItem::Type) {
QGraphicsEllipseItem* ellipse = static_cast<QGraphicsEllipseItem*>(item);
coordinates.append(ellipse->mapToScene(ellipse->rect().center()));
}
}
return coordinates;
}5. 坐標(biāo)轉(zhuǎn)換說(shuō)明
Qt 圖形視圖框架有三級(jí)坐標(biāo)系:
- 圖元局部坐標(biāo):相對(duì)于圖元自身的坐標(biāo)系
- 場(chǎng)景坐標(biāo):所有圖元共用的全局坐標(biāo)系
- 視圖坐標(biāo):窗口部件的像素坐標(biāo)系
常用轉(zhuǎn)換方法:
// 局部坐標(biāo) → 場(chǎng)景坐標(biāo) QPointF scenePos = item->mapToScene(localPos); // 場(chǎng)景坐標(biāo) → 視圖坐標(biāo) QPoint viewPos = graphicsView->mapFromScene(scenePos); // 視圖坐標(biāo) → 場(chǎng)景坐標(biāo) QPointF scenePos = graphicsView->mapToScene(viewPos);
注意事項(xiàng)
- 如果圖元有旋轉(zhuǎn)或縮放,直接使用
scenePos()可能不準(zhǔn)確,建議使用mapToScene(rect.center()) - 確保在獲取坐標(biāo)前圖元已被添加到場(chǎng)景中
- 對(duì)于非常精確的坐標(biāo)需求,考慮設(shè)置圖元的
CacheMode為DeviceCoordinateCache
到此這篇關(guān)于QT中QGraphicsItem 獲取點(diǎn)坐標(biāo)的幾種方法的文章就介紹到這了,更多相關(guān)QT QGraphicsItem 獲取點(diǎn)坐標(biāo)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用C語(yǔ)言實(shí)現(xiàn)內(nèi)存池的示例代碼
所謂內(nèi)存池,顧名思義和線程池的設(shè)計(jì)原理是一樣的,為了減少頻繁申請(qǐng)釋放內(nèi)存而帶來(lái)的資源消耗,減少釋放內(nèi)存后產(chǎn)生的內(nèi)存碎片,下面我們就來(lái)看看如何使用C語(yǔ)言實(shí)現(xiàn)內(nèi)存池吧2024-02-02
求素?cái)?shù),用vector存儲(chǔ)的實(shí)現(xiàn)方法
本篇文章是對(duì)求素?cái)?shù),用vector存儲(chǔ)的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
VC++植物大戰(zhàn)僵尸中文版修改器實(shí)現(xiàn)代碼
這篇文章主要介紹了VC++植物大戰(zhàn)僵尸中文版修改器實(shí)現(xiàn)代碼,可實(shí)現(xiàn)植物大戰(zhàn)僵尸中的無(wú)限陽(yáng)光與無(wú)冷卻時(shí)間功能,需要的朋友可以參考下2015-04-04
基于C語(yǔ)言模擬實(shí)現(xiàn)人生重開(kāi)模擬器游戲
人生重開(kāi)模擬器是前段時(shí)間非?;鸬囊粋€(gè)小游戲,所以本文我們將一起學(xué)習(xí)使用c語(yǔ)言寫(xiě)一個(gè)簡(jiǎn)易版的人生重開(kāi)模擬器,感興趣的小伙伴可以了解下2024-02-02
C語(yǔ)言實(shí)現(xiàn)文件內(nèi)容按行隨機(jī)排列的算法示例
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)文件內(nèi)容按行隨機(jī)排列的算法,涉及C語(yǔ)言字符串、數(shù)組遍歷與隨機(jī)數(shù)相關(guān)算法實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-09-09
C++中實(shí)現(xiàn)線程安全和延遲執(zhí)行詳解
這篇文章主要為大家詳細(xì)介紹了C++中實(shí)現(xiàn)線程安全和延遲執(zhí)行的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的小伙伴可以了解下2024-01-01

