【QT】 QGraphicsItem 獲取點坐標的幾種方法

目錄

1. 獲取圖元在場景中的位置

對于 QGraphicsEllipseItem(點圖元)

2. 從 QMap 獲取所有點坐標

3. 響應點擊事件獲取坐標

4. 獲取選中點的坐標

5. 坐標轉換說明

注意事項

在 Qt 圖形視圖框架中,從 QGraphicsItem(特別是點圖元)獲取坐標有多種方式,取決于你需要的是場景坐標、視圖坐標還是圖元自身的局部坐標。

1. 獲取圖元在場景中的位置

對于 QGraphicsEllipseItem(點圖元)

// 假設 item 是你的 QGraphicsEllipseItem 指針
if (QGraphicsEllipseItem* pointItem = qgraphicsitem_cast<QGraphicsEllipseItem*>(item)) {// 獲取圖元中心點在場景中的坐標QPointF scenePos = pointItem->scenePos();// 或者獲取包圍矩形的中心QRectF rect = pointItem->rect();QPointF centerInItem = rect.center();QPointF centerInScene = pointItem->mapToScene(centerInItem);qDebug() << "場景坐標:" << scenePos;qDebug() << "精確中心坐標:" << centerInScene;
}

2. 從 QMap<int, QGraphicsEllipseItem*> 獲取所有點坐標

QMap<int, QGraphicsEllipseItem*> pointMap; // 你的點圖元容器// 遍歷獲取所有點坐標
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() << "點ID:" << id << "場景坐標:" << center;// 如果需要視圖坐標(像素坐標)QPoint viewPos = mGraphicsView->mapFromScene(center);qDebug() << "視圖坐標:" << viewPos;
}

3. 響應點擊事件獲取坐標

// 在場景子類中重寫鼠標事件
void MyGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent* event) {QGraphicsScene::mousePressEvent(event); // 先讓基類處理選擇邏輯// 獲取點擊位置的圖元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() << "點擊了點圖元,中心坐標:" << center;}
}

4. 獲取選中點的坐標

// 獲取當前選中的所有點圖元坐標
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. 坐標轉換說明

Qt 圖形視圖框架有三級坐標系:

  • 圖元局部坐標:相對于圖元自身的坐標系

  • 場景坐標:所有圖元共用的全局坐標系

  • 視圖坐標:窗口部件的像素坐標系

常用轉換方法:

// 局部坐標 → 場景坐標
QPointF scenePos = item->mapToScene(localPos);// 場景坐標 → 視圖坐標
QPoint viewPos = graphicsView->mapFromScene(scenePos);// 視圖坐標 → 場景坐標
QPointF scenePos = graphicsView->mapToScene(viewPos);

注意事項

  1. 如果圖元有旋轉或縮放,直接使用?scenePos()?可能不準確,建議使用?mapToScene(rect.center())

  2. 確保在獲取坐標前圖元已被添加到場景中

  3. 對于非常精確的坐標需求,考慮設置圖元的?CacheMode?為?DeviceCoordinateCache

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/909208.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/909208.shtml
英文地址,請注明出處:http://en.pswp.cn/news/909208.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

伊吖學C筆記(6、數、求和、排列)

一、數 1.自然數、奇偶數 自然數也就是非負整數&#xff0c;C的循環語句很容易輸出自然數&#xff0c;比如&#xff1a;輸出100以內的自然數。 奇數、偶數也都是自然數&#xff1a; 2. 約數、因數 題目&#xff1a;一個數如果恰好等于它的因子之和&#xff0c;這個數就稱為“…

SpringMVC與Struts2對比教學

SpringMVC 和 Struts2 就像武林中的兩大門派&#xff0c;雖然都是處理 Web 請求的高手&#xff08;MVC 框架&#xff09;&#xff0c;但招式風格和內功心法大不相同。來&#xff0c;咱們用最接地氣的方式掰扯掰扯&#xff0c;保準你笑著記住&#xff01; 核心區別一句話概括&a…

Nginx配置指南與最佳實踐

Nginx 的配置文件通常位于 /etc/nginx/nginx.conf&#xff0c;并通過 include 指令加載其他目錄&#xff08;如 /etc/nginx/conf.d/ 或 /etc/nginx/sites-enabled/&#xff09;中的配置片段。以下是一個結構化指南&#xff1a; 核心配置結構 # 全局配置 (主上下文) user nginx…

Apache 反向代理Unity服務器

Apache 反向代理Unity服務器 前言項目使用PHPStudy開啟服務修改配置文件修改配置負載均衡&#xff08;可選&#xff09;重啟 總結 前言 使用Unity開了個后臺服務器&#xff0c;但是另一個Java服務器進行大量異步請求時會導致服務器回復過慢&#xff0c;所以開一個Apache緩沖一…

【力扣 簡單 C++】94. 二叉樹的中序遍歷

目錄 題目 解法一&#xff1a;遞歸 解法二&#xff1a;迭代 解法三&#xff1a;Morris遍歷 題目 解法一&#xff1a;遞歸 class Solution { private:void traverse(TreeNode* root, vector<int>& inorder){if (!root)return;traverse(root->left, inorder);i…

idea2024版本設置TODO快捷鍵

直接開干&#xff1a; 首先打開File–>Settings…–>Editor–>Live Templates 復制文本&#xff1a;//wk TODO $data$ 定義自定義todo使用范圍&#xff1a; 設置自定義todo的過濾器&#xff1a; 正式開始設置todo的過濾器&#xff1a; 復制文本&#xff1a; \bwk TO…

云原生核心技術 (12/12): 終章:使用 GitLab CI 將應用自動部署到 K8s (保姆級教程)

大家好&#xff0c;歡迎來到《云原生核心技術》系列的最終章&#xff01; 我們一起走過了漫長而充實的旅程。從 Docker 的集裝箱&#xff0c;到 K8s 這座自動化的數字港口&#xff1b;從部署單個 Pod&#xff0c;到構建復雜的有狀態應用。現在&#xff0c;我們站在了實現全自動…

DEVICENET轉MODBUS TCP網關連接ABB機器人配置案例

在工業自動化場景中&#xff0c;DeviceNet和Modbus TCP是兩種常見的通信協議。DeviceNet通常用于連接現場設備&#xff08;如傳感器、執行器等&#xff09;&#xff0c;而Modbus TCP則廣泛應用于以太網環境下的遠程監控和數據采集。當需要將基于DeviceNet協議的ABB機器人集成到…

達夢數據庫單機部署dmhs同步復制(dm8->kafka)

本文討論了達夢數據實時同步軟件DMHS的相關內容&#xff0c;包括概念總結、環境模擬及部署實現從達夢數據庫到Kafka隊列的同步復制。關鍵要點包括&#xff1a; 1.DMHS系統概述&#xff1a; 達夢公司推出的異構環境高性能數據庫實時同步系統&#xff0c;可應用于應急、容災等多…

爬蟲+動態代理助力 AI 訓練數據采集

文章目錄 引言新手之選&#xff1a;網頁抓取API可靠之選&#xff1a;動態住宅代理總結 引言 近年來&#xff0c;AI 技術飛速發展&#xff0c;很多朋友都投身于 AI 模型的訓練。然而&#xff0c;相較于模型的獲取&#xff0c;高質量的數據往往更加難以收集。一方面&#xff0…

OpenEuler服務器警告郵件自動化發送:原理、配置與安全實踐

OpenEuler服務器警告郵件自動化發送&#xff1a;原理、配置與安全實踐 在服務器的運維管理過程中&#xff0c;及時感知系統異常狀態至關重要。當OpenEuler系統運行時&#xff0c;將服務器的警告信息實時推送至郵箱&#xff0c;能幫助運維人員快速響應潛在問題&#xff0c;保障…

使用vite-plugin-html在 HTML 文件中動態注入數據,如元數據、環境變量、標題

vite-plugin-html 是一個用于 Vite 構建工具的插件&#xff0c;它可以幫助你在構建過程中動態注入一些 HTML 內容&#xff0c;比如標題、元數據、環境變量等。通過使用這個插件&#xff0c;你可以根據項目的配置和環境變量自動生成帶有動態內容的 HTML 文件&#xff0c;適用于 …

學習筆記087——Java接口和抽象類的區別和使用

文章目錄 1、主要區別2、使用場景2.1 使用接口的情況&#xff1a;2.1 使用抽象類的情況&#xff1a; 3、Java 8及以后的接口增強4、設計建議 1、主要區別 特性接口(Interface)抽象類(Abstract Class)定義方式使用interface關鍵字使用abstract class關鍵字方法實現Java 8前不能…

Squid 代理服務器實戰:解決動態 IP 訪問第三方接口的生產級方案

前言&#xff1a;動態IP場景下的業務痛點與解決方案 在企業開發場景中&#xff0c;經常會遇到這樣的需求&#xff1a;第三方服務&#xff08;如API接口、云平臺服務&#xff09;要求將訪問源IP加入白名單以保障安全。然而&#xff0c;企業辦公網絡通常采用動態IP分配&#xff0…

React中子傳父組件通信操作指南

文章目錄 為什么需要子傳父通信&#xff1f;方法一&#xff1a;回調函數&#xff08;最常用&#xff09;基礎示例實際場景&#xff1a;待辦事項列表 方法二&#xff1a;使用useRef傳遞引用方法三&#xff1a;Context API&#xff08;跨層級通信&#xff09;方法四&#xff1a;自…

【android bluetooth 框架分析 04】【bt-framework 層詳解 5】【AbstractionLayer介紹】

1. AbstractionLayer 介紹 我們在閱讀 native 和 java 層 藍牙服務代碼時&#xff0c;會發現很多 AbstractionLayer.xxxxx 的字段。 這些字段 雖然很容易理解是干什么的。 但是 大家有沒有考慮過&#xff0c; 為啥要專門定義一個類來存放他們。 這樣設計的意義是什么&#xff…

AI大模型從0到1記錄學習 大模型技術之機器學習 day27-day60

機器學習概述 機器學習&#xff08;Machine Learning, ML&#xff09;主要研究計算機系統對于特定任務的性能&#xff0c;逐步進行改善的算法和統計模型。通過輸入海量訓練數據對模型進行訓練&#xff0c;使模型掌握數據所蘊含的潛在規律&#xff0c;進而對新輸入的數據進行準確…

c/c++ 匯編碼中的.cfi 指令有什么用途?

author: hjjdebug date: 2025年 06月 12日 星期四 14:24:40 CST descrip: c/c 匯編碼中的.cfi 指令有什么用途? 文章目錄 1. 幾個簡寫詞.2. 看一個簡單的測試代碼:3. 生成匯編代碼:4. 分析.cfi 指令5. 小結: 1. 幾個簡寫詞. cfi(call frame info) 調用幀信息, 名詞. 描述的是…

ArcGIS Pro 3.4 二次開發 - 任務

環境:ArcGIS Pro SDK 3.4 + .NET 8 文章目錄 任務1 任務1.1 檢索項目中的所有任務項1.2 打開任務文件 - .esriTasks 文件1.3 打開項目任務項1.4 關閉任務項1.5 導出任務項1.6 獲取任務信息 - 從 TaskProjectItem1.7 獲取任務信息 - 從 .esriTasks 文件1.8 在任務文件中打開特定…

vscode如何修改終端的默認配置

問題困擾&#xff1a; 每次打開都是 powershell, 因為每次要是用 git bash, 所以每次手動切換很麻煩。 要將默認終端設置為 Git Bash&#xff0c;可以通過以下步驟完成。以下是詳細的操作方法&#xff1a; 步驟 1&#xff1a;打開終端設置 在 Visual Studio Code 的菜單欄中…