开发者

Dragging rectangle bigger than item itself using QGrahicsRectItem

开发者 https://www.devze.com 2023-02-20 10:06 出处:网络
I have a problem with a QGrahicsRectItem in a QGraphicsScene. What I would like is to be able to move the item with mouse. But the problem is that in my case, the dragging rectangle is bigger than the

I have a problem with a QGrahicsRectItem in a QGraphicsScene. What I would like is to be able to move the item with mouse. But the problem is that in my case, the dragging rectangle is bigger than the item itself.

Here is the code that I use:

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->s开发者_开发知识库etBrush(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());
}

So when I run my program I have this window, and I can drag items. All seems OK.

Dragging rectangle bigger than item itself using QGrahicsRectItem

But if I look closer the dragging zone is bigger than the item itself. (see the blue rectangle on following screenshot) The blue rectangle means that If I move the mouse in this rectangle, the cursor changes, and I can drag the item.

Dragging rectangle bigger than item itself using QGrahicsRectItem

I have the feeling that the problem is related to the “fitInView(scene()->sceneRect());” line. If I remove it, then it works. If I add a ‘scale(5,1)’ for example, there is the same problem.

Do you have an idea of what the problem could be?


I think you hit this bug: http://bugreports.qt-project.org/browse/QTBUG-17985

What happens is Qt uses a scene rectangle that is 1x1 in size to test if items are under the cursor. In your (and my) case, 1 unit in the scene is larger than 1 pixel on screen. So the 1x1 rectangle covers more than 1 pixel from the cursor, and touches items that are not under the cursor.

I have submitted a fix/merge request. You can modify your Qt source to make it work for now.have

0

精彩评论

暂无评论...
验证码 换一张
取 消