Qt的painter相關(針對QGraphicsItem和item中的繪製的座標相關測試)
阿新 • • 發佈:2019-02-09
記錄下自己在實際進行封裝item的時候,出現的一個現象bug,
以自己實際的測試為標準:
封裝繪製一個圓的控制元件的時候,直接對paint()函式進行重新,也對該
程式碼如下:
painter->setPen(QPen(QBrush(penColor),0));
painter->drawEllipse(QRectF(m_x,m_y,m_width,m_height));
painter->setBrush(QBrush(QColor(255,0,0)));
boundingRect()函式如下:
QRectF rf = QRectF(m_x,m_y,m_width,m_height);
return rf;
對,上述程式碼測試都是沒有問題,是顯示上都沒有問題,但是如果我需要對繪製的rect區域進行拖動或者放大縮小的話就會出現問題,你會發現,你封裝的item的物件的new的例項的pos一直都是(0,0),
這就導致了在拖動和放大縮小的時候,尤其是拖動的時候會出現亂七八糟的狀況,
將上述的程式碼改為
painter->setPen(QPen(QBrush(penColor),0));
painter->drawEllipse(QRectF(0,0,m_width,m_height));
painter->setBrush(QBrush(QColor(255 ,0,0)));
boundingRect()函式如下:
QRectF rf = QRectF(0,0,m_width,m_height);
return rf;
同時要確定在移動的時候需要對item的pos進行設定,(setPos()函式)
上述出現的原因是,不管是paint()函式還是boundingRect()函式的中的QRect(qreal x,qreal y,qreal w,qreal h),只是表示在item的某個位置的區域,和item本身是沒有關係的,所以在對item移動和縮放操作的時候,改變QRect中的x,y是沒有任何意義的(有一點意義就是在介面上是沒問題的,但是本身的邏輯就已經出問題了,這在複雜的情況下就會出現邏輯上bug)。而且對應的QRect中的x,y都是相對於item的本身的座標作為參考系的。
如果只是單純的達到顯示效果,那麼第一種封裝方法是可以的。
分享學習