Перетаскивание прямоугольника большего размера, чем сам элемент, с помощью QGrahicsRectItem

У меня проблема с QGrahicsRectItem в QGraphicsScene. Я хотел бы иметь возможность перемещать элемент с помощью мыши. Но проблема в том, что в моем случае прямоугольник перетаскивания больше самого элемента.

Вот код, который я использую:

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());
}

Поэтому, когда я запускаю свою программу, у меня есть это окно, и я могу перетаскивать элементы. Все кажется в порядке.

screen1

Но если я присмотрюсь, то зона перетаскивания больше, чем сам предмет. (см. синий прямоугольник на следующем снимке экрана) Синий прямоугольник означает, что если я перемещаю мышь в этом прямоугольнике, курсор изменяется, и я могу перетаскивать элемент.

screen2

У меня такое ощущение, что проблема связана с "fitInView(scene()->sceneRect());" линия. Если убрать, то работает. Если я добавлю, например, «шкалу (5,1)», возникнет та же проблема.

У вас есть идея, в чем может быть проблема?


person penpen    schedule 28.03.2011    source источник
comment
Что произойдет, если вы добавите KeepAspectRatio к вызову fitInView? У него все еще есть неправильный прямоугольник перетаскивания? Похоже, что прямоугольник рисования и прямоугольник перетаскивания каким-то образом не синхронизированы после преобразования.   -  person Stephen Chu    schedule 28.03.2011


Ответы (1)


Я думаю, вы столкнулись с этой ошибкой: http://bugreports.qt-project.org/browse/QTBUG-17985

Что происходит, так это то, что Qt использует прямоугольник сцены размером 1x1, чтобы проверить, находятся ли элементы под курсором. В вашем (и моем) случае 1 единица в сцене больше, чем 1 пиксель на экране. Таким образом, прямоугольник 1x1 закрывает более 1 пикселя от курсора и касается элементов, которые не находятся под курсором.

Я отправил запрос на исправление/слияние. Вы можете изменить свой исходный код Qt, чтобы он работал на данный момент.

person Stephen Chu    schedule 01.04.2011
comment
Спасибо за помощь! Так что это был баг в QT, я мог долго искать. QT обычно настолько стабилен, что я не предполагал, что это может быть ошибкой :) К сожалению, у меня не было времени, и мне нужно было найти решение, поэтому я создал свои собственные GraphicsView, GraphicsScene и GraphicsItem, с моим собственным выбором, перемещением, алгоритмы изменения размера :( - person penpen; 02.04.2011
comment
Я считаю, что это больше, чем просто одна ошибка в одном месте. В графическом представлении/сцене используется квадрат 1x1 для точечного теста. QGraphicsScene и его вспомогательные классы на самом деле имеют специальный код для проверки точки в элементе. Почему-то никто не пользуется. Использование прямоугольника вместо точки математически нулевого размера, каким бы маленьким ни был прямоугольник, обязательно вызовет ошибки. - person Stephen Chu; 03.04.2011