Перетаскивание прямоугольника больше самого элемента с помощью QGrahicsRectItem - PullRequest
1 голос
/ 28 марта 2011

У меня проблема с 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

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

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

1 Ответ

0 голосов
/ 01 апреля 2011

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

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

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

...