2012-11-05 49 views
2

我試圖設置一個使用插件的GUI。在我目前的階段,我需要用戶點擊並指定點的位置。防止QGraphicsItem :: itemAt()在「背景項目」上

我設置的插件體系結構要求插件返回插件希望使用的QGraphicsItem。在主程序(未來的插件作者無法訪問)中,我設置了背景圖像來指導點擊。插件可以使用itemChange()偷偷摸摸地訪問scene(),並在所設置的場景上安裝eventFilter()。這允許插件訪問場景點擊並處理它需要的任何信息。但是,itemAt()調用將返回背景圖片。

我想阻止這個背景Pixmap從itemAt()返回所有將來的插件。這可能嗎?


嘗試:

setEnabled(false); //No success 
+1

你可以簡單地重新實現'QGraphicsScene :: drawBackground'並在那裏繪製像素圖嗎?因此不需要物品。 – Anthony

+0

這是一個有趣的方法,我一定會研究這個。如果你做出答案,我可以接受。 – Constantin

回答

1

這並不直接回答你的問題,但它應該解決你的問題:我建議重新實現QGraphicsScene::drawBackground()並在那裏繪製你的pixmap。這就是該方法的用途。

一個類似的方法是將像素映射到資源文件中,然後使用樣式表將其設置爲QGraphicsView或其視口控件的背景(我認爲這些控件有稍微不同的效果)。

0

爲了使不可見的項目到itemAt()(或任何其他的碰撞檢測方法)可以使boundingRect()方法返回QRectF零寬度和高度。

這雖然有副作用,使任何部分視口更新模式的QGraphicsView故障,因爲QGV沒有任何想法的項目將要繪製自己。這可以通過讓QGV在每次重繪完成更新(setViewportUpdateMode(QGraphicsView :: FullViewportUpdate))來彌補。根據你的場景,這可能是一個可以接受的折中方案。如果您使用的是OpenGL圖形後端,則視口更新始終是完整更新。