2011-03-28 44 views
1

我在QGraphicsScene中遇到QGrahicsRectItem的問題。我想要的是能夠用鼠標移動項目。但問題是,在我的情況下,拖動的矩形比項目本身更大。使用QGrahicsRectItem拖動比項目本身大的矩形

這裏是我使用的代碼:

class Test: public QGraphicsView 
{ 
    public: 
    Test(); 

    private: 
    virtual void resizeEvent (QResizeEvent * event); 
    QGraphicsScene* m_pScene; 
}; 

Test::Test() 
{ 
    m_pScene = new QGraphicsScene(); 
    setScene(m_pScene); 

    m_pScene->setSceneRect(0, 0, 100, 100); 

    for (int i = 0 ; i < 10 ; i++) 
    { 
     QGraphicsRectItem * pItem = new QGraphicsRectItem(); 
     pItem->setFlag(QGraphicsItem::ItemIsMovable); 
     pItem->setBrush(QBrush(QColor(190, 100, 100))); 
     pItem->setRect(QRectF(10*i, 10, 5, 80.f)); 
     pItem->setCursor(Qt::SizeAllCursor); 
     m_pScene->addItem(pItem); 
    } 


    setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
    setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 

    resize(600, 200); 
    fitInView(scene()->sceneRect()); 
    show(); 
} 

void Test::resizeEvent(QResizeEvent * event) 
{ 
    QGraphicsView::resizeEvent(event); 
    fitInView(scene()->sceneRect()); 
} 

所以,當我跑我的程序我有這個窗口,我可以將項目。一切似乎都OK。

screen1

但是,如果我仔細看拖動區比項目本身更大。 (請參閱以下屏幕截圖上的藍色矩形)藍色矩形表示如果我在此矩形中移動鼠標,則光標會更改,並且我可以拖動該項目。

screen2

我有一個問題涉及到的感覺「fitInView(場景() - > sceneRect());」行。如果我刪除它,那麼它的工作。 例如,如果我添加一個'scale(5,1)',就有同樣的問題。

你有什麼問題的想法?

+0

如果將KeepAspectRatio添加到fitInView調用中,會發生什麼情況?它是否仍然有錯誤的拖拽?它看起來像轉換後的paint rect和drag rect在某種程度上不同步。 – 2011-03-28 12:57:28

回答

0

我想你打這個錯誤:http://bugreports.qt-project.org/browse/QTBUG-17985

會發生什麼事是Qt使用場景矩形是1x1的大小來測試項目光標下。在你的(和我的)情況下,場景中的1個單位大於屏幕上的1個像素。因此,1x1矩形覆蓋光標上的多個像素,並觸摸不在光標下的項目。

我已提交修復/合併請求。您可以修改您的Qt源代碼以使其工作.have

+0

感謝您的幫助!所以這是QT中的一個bug,我可以搜索很長時間。 QT通常非常穩定,以至於我沒有想到它會被視爲一個bug :)不幸的是,我沒有時間,也不得不尋找解決方案,所以我創建了自己的GraphicsView,GraphicsScene和GraphicsItem,用我自己的選擇,移動,調整大小算法:( – penpen 2011-04-02 08:08:59

+0

)我發現它不僅僅是一個點的一個bug,通過圖形視圖/場景,它使用1x1方塊進行點測試,QGraphicsScene和它的支持類實際上有特殊的代碼來測試項目中的一個點。不知何故,沒有人正在使用它。使用一個矩形在數學上爲零的大小點,無論它是什麼小矩形,都必然會導致錯誤。 – 2011-04-03 12:26:57