1. 程式人生 > >在QGraphicsScene中限制圖元的拖動範圍

在QGraphicsScene中限制圖元的拖動範圍

欲使QGraphicsItem可拖動,則需設定標誌位:setFlag(ItemIsMovable,true);

而如果想限制QGraphicsItem物件的移動範圍,需要繼承QGraphicsItem類,過載itemChange()虛擬函式,關於該函式的過載,QT文件中示例如下:

QVariant Component::itemChange(GraphicsItemChange change, const QVariant &value)
{
    if (change == ItemPositionChange && scene()) {
        // value is the new position.
QPointF newPos = value.toPointF(); QRectF rect = scene()->sceneRect(); if (!rect.contains(newPos)) { // Keep the item inside the scene rect. newPos.setX(qMin(rect.right(), qMax(newPos.x(), rect.left()))); newPos.setY(qMin(rect.bottom(), qMax(newPos.y(), rect.top()))); return
newPos; } } return QGraphicsItem::itemChange(change, value); }

ItemPositionChange 用於通知所屬QGraphicsItem的位置即將發生變化,而value的值即為QGraphicsItem將來的位置座標,以上程式碼把item將來的位置座標value與scene rect 的上下左右邊界進行比較,根據比較結果更改value,使其取值在scene rect 範圍內, 進而達到了限制item拖動範圍的目的。

但上述程式碼只有在QGraphicsScene的大小已經被事先設定好了才好用,如果預先未設定QGraphicsScene大小,那麼scene的大小將隨著item的新增不斷增大,這種範圍的限制就沒什麼意義了。

如果我們即想將scene設為自動無限增大的,又想限制item在某方向的拖動,只要找到限制拖動的那條基準線的橫座標或者縱座標,按照與上述程式碼中同樣的原理,就可輕鬆限制item的拖動,甚至可以使item按照指定路線被拖動。

相關推薦

QGraphicsScene限制範圍

欲使QGraphicsItem可拖動,則需設定標誌位:setFlag(ItemIsMovable,true); 而如果想限制QGraphicsItem物件的移動範圍,需要繼承QGraphicsItem類,過載itemChange()虛擬函式,關於該函式的過載,

WEBGIS實現限制地圖範圍及縮放比例及extent()引數說明

專案要求:使用圖片覆蓋在地圖 根據經緯度確定圖片真實地理位置 使用切圖工具(MapTiler)對圖片進行瓦片化 然後顯示在地圖。 問題描述:圖片覆蓋到地圖後可以隨意拖動和縮放,影響使用者體驗。 解決方法: openlayers實現瓦片切圖覆蓋地圖及設定拖動範圍和縮放比例: //地圖拖拽經

移動端並獲取移動後的坐標

nal 坐標 posit 移動端 top 一次 target eve pan 這兩天在做關於合同蓋章的需求,要求在移動端能拖動章,並獲取章的坐標。在網上也看了一些相關代碼,最後整理出一份demo。整理的匆忙,代碼仍存在bug,當第一次移動章手指擡起後,再次點擊一下章,坐標

Devexpress ASP.NETASPxTreeList節點的

估計很少有人知道Dev在ASP.NET中也能拖動節點。這個功能在我們需要對同一棵樹的節點的位置進行調整的時候能用到。 前臺樹程式碼: <dx:ASPxTreeList Width="400" ID="trlcustom" ClientInstanceName="trl

JSplitPane分隔條禁止

轉自:http://blog.csdn.net/sun1956/article/details/8237682 1、禁止分隔條:Java中分割面板是個不錯的應用,可以將一個面板分隔成兩個部分,一部分可以當作選單,另一部分可以當作點選選單項時的響應介面。 JSplit

OFFICE2007 WORD無法使用滑鼠和選取選單項

方法一(推薦):   開啟Word,點選左上角的圓形按鈕,選擇"Word選項",然後選擇"載入項",接著在最下端的"管理"右側的下拉框中選擇"COM載入項",然後點選"轉到按鈕",最後在彈出的"COM載入項"管理視窗中取消"PowerDesigner12....."載入項前

Android自定上下Viewpager

我們在淘寶上購物的時候,在瀏覽商品頁面時,有看到有”繼續拖動,檢視圖文詳情”,實則就是縱向拖動的Viewpager。今天我們就要來實現它。先上效果圖。 要實現上面的效果,我們今天必須學習兩樣東西,一個就是ViewDragHelper,另外一個就是Gestu

openlayer範圍設定

var mapOptions = { projection : new OpenLayers.Projection('EPSG:4326'), maxExtent : new OpenLayers.Bounds(121.95669802850942,37.3021

Unity實現揹包物品和更換位置

using UnityEngine; using System.Collections; using UnityEngine.UI; using UnityEngine.EventSystems; public class PointMoveContro

研究完美顯示K線:縮放、、多MACD疊加

原文請看:https://www.joinquant.com/post/13121?tag=algorithm 2018年11月30日更新: 修正了MACD線不顯示的問題。 以下是原文: 想展現資料,圖無疑是最好的方式。展示股票資料,當然是K線圖了,之前論內有人用matplotlib

在VARCHART XGantt甘特控制元件輕鬆增強的快照工具

VARCHART XGantt是一款功能強大的甘特圖控制元件,其模組化的設計讓您可以建立滿足需要的應用程式。XGantt可用於.NET,ActiveX和ASP.NET應用程式,可以快速、簡單地整合到您的應用程式中,幫助您識別效能瓶頸、避免延遲以及高效利用資源,使複雜資料變得更加容易理解。可以點選下方

Android:圖片疊加文字,支持改變位置

ear nal format wrap trace ast 分享 gravity ica 之所以做了這麽一個Demo,是由於近期項目中有一個奇葩的需求:用戶拍攝照片後,分享到微信的同一時候加入備註,想獲取用戶在微信的彈出框輸入的內容。保存在自己的server上。而其實,

dropzone文件上傳在thinkphp5應用一個實例

php dropzone參考:Dropzone的使用方法點擊查看dropzone中文文檔後臺用的INSPINIA框架的模板,裏面有,dropzone.jsdropzone是一個可以拖文件上傳的js.拖進去,就上傳了。我在頁面上,寫了一個保存已經上傳的文件的image3,image4.這就需要改寫一下dropz

unity UGUI的按下、接口事件的實現

pointer 攝像機 sys parent generic npoi del 返回 ren using UnityEngine; using System.Collections.Generic; using DG.Tweening; using UnityEn

記一個react排序的坑:key

map 一個 解決方案 () 不重復 tab 需求 unique nbsp 在做一個基於react的應用的時候遇到了對列表拖動排序的需求。當使用sortable對列表添加排序支持後發現一個問題:數據正確排序了,但是dom的順序卻亂了,找了一會兒原因後發現是因為在渲染數據的時

Flutter的點選、和其它手勢

在Android中,您可以通過呼叫方法setOnClickListener將OnClick繫結到按鈕等view上. 在Flutter中,新增觸控監聽器有兩種方法: 如果Widget支援事件監聽,則可以將一個函式傳遞給它並進行處理。例如,RaisedButton有一個onPre

WPF MVVM模式,通過命令實現窗體、跳轉以及顯隱控制

原文: WPF MVVM模式中,通過命令實現窗體拖動、跳轉以及顯隱控制 在WPF中使用MVVM模式,可以讓我們的程式實現介面與功能的分離,方便開發,易於維護。但是,很多初學者會在使用MVVM的過程中遇到一個顯而易見且無法迴避的問題,那就是不同的窗體之間如何跳轉?很多人在介紹MVVM的使用時,都沒有明顯提到該

duiliblist表頭大小內容大小跟隨變化的一個示例

偶爾有群裡的朋友在問duilib的List拖動列表頭時內容大小如何跟隨變化。我這邊用新版的duilib程式碼測試是沒有問題。 duilib官方程式碼倉庫https://github.com/duilib/duilib 個人的修改的程式碼的倉庫:https://github.com/juh

解決Qt graphis-view框架,上層接收hover事件導致底層接收不到的問題

問題重現 兩個圖元,一個在上面,名為item_up,一個在下面,名為item_below。 當item_up->setAcceptHoverEvents(true)時,item_up可以接收到滑鼠懸停事件(hoverEnter,hoverMove,hoverMove)。但是下層

自定義View的大轉盤和的小球

public class ZPView2 extends View implements View.OnClickListener { //文字內容 private String[] contents=new String[]{“美 食”, “購 物”, “商 場”, “豐 滿”, “性 感