天天看點

Qt的painter相關(針對QGraphicsItem和item中的繪制的坐标相關測試)

記錄下自己在實際進行封裝item的時候,出現的一個現象bug,

以自己實際的測試為标準:

封裝繪制一個圓的控件的時候,直接對paint()函數進行重新,也對該

代碼如下:

painter->setPen(QPen(QBrush(penColor),));
    painter->drawEllipse(QRectF(m_x,m_y,m_width,m_height));

    painter->setBrush(QBrush(QColor(,,)));
           

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),));
    painter->drawEllipse(QRectF(,,m_width,m_height));

    painter->setBrush(QBrush(QColor(,,)));
           

boundingRect()函數如下:

QRectF rf = QRectF(,,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的本身的坐标作為參考系的。

如果隻是單純的達到顯示效果,那麼第一種封裝方法是可以的。

分享學習

繼續閱讀