最近開發中遇到了問題:
繼承QGraphicsItem,自定義圖形項,重寫了paint和boundingRect,因為圖形項是不規則的,所以希望能夠回傳圖元的大概形狀,而不只是矩形框。參考了幫助檔案重寫shape(),回傳的區域還是boundingRect的矩形框。網上查了很多資料,都和幫助檔案一樣,希望哪位朋友不吝賜教
uj5u.com熱心網友回復:
重寫shape()計算你的不規則區域 然后回傳一個path即可
uj5u.com熱心網友回復:
謝謝你回我的帖子。我已經重寫了,類似如下簡單重寫shape()函式:
QPainterPath path;
path.addEllipse(boundingRect());
return path;
然后我在paint()函式里面將這塊區域畫了出來:
painter->drawPath(shape());
顯示的還是矩形邊界,不是橢圓。
之后也寫了其他代碼,回傳不規則區域,但最后用paint顯示出來的還是矩形區域。
難道不是這么用的嗎,還是我哪一步做錯了。但是QT的幫助檔案里面的例子也是我上面寫的代碼,所以現在就是不知道怎么辦。
網上找資料,都是說重寫shape()回傳圖元的準確形狀,用于接收事件、碰撞檢測等等。。。。
uj5u.com熱心網友回復:
QPainterPath shape() const;
我估計你是這個const丟了,導致函式重寫失敗
uj5u.com熱心網友回復:
QPainterPath ConnectLine::shape() const{
QPainterPathStroker stroker;
stroker.setWidth(6);
return stroker.createStroke(path);
}
uj5u.com熱心網友回復:
我發現問題是:場景的滑鼠點擊事件默認呼叫圖元的boundingRect()函式,而不呼叫我重寫的shape()函式。各位有遇到這樣的情況嗎?
uj5u.com熱心網友回復:
把你的代碼貼出來。除非你的函式名寫錯了,不然肯定能行。uj5u.com熱心網友回復:

uj5u.com熱心網友回復:
你把path用qdebug輸出一下。如果這個物件無效的話,的確會回退呼叫boundingrectuj5u.com熱心網友回復:
無效,打斷點也沒用,只會到boundingRect()里面。uj5u.com熱心網友回復:
你用qdebug輸出,不要打斷點
然后你拖拽item,讓scene觸發shape呼叫
看輸出什么資訊
uj5u.com熱心網友回復:
他就是怎么都不呼叫shape函式,就呼叫bounding
uj5u.com熱心網友回復:
需要確定你的boundingRect()回傳是否為Valid,即寬高都為整數,QRect里面有Valid函式。uj5u.com熱心網友回復:
哦,輸錯了,是正數轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/40815.html
標籤:Qt
