Как изменить положение boundingRect() QGraphicsItem в QGraphicsScene?

Я установил boundingRect() моего QGraphicsItem на определенную координату на сцене. Как я могу изменить координаты на основе QGraphicsItem::mouseMoveEvent?


Ниже приведен код, который я написал. Но этот код только устанавливает положение фигуры, которую я нарисовал в пределах boundingRect(), в координату внутри boundingRect(). Что я хочу сделать, так это переместить весь QGraphicsItem в заданную координату.

void QGraphicsItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    QGraphicsItem::mouseMoveEvent(event);

    if (y()>=394 && y()<425) //if in the range between 425 and 394 I want it to move to 440.
    {
        setPos(440, y());
    }
    else if ... //Other ranges such as that in the first if statement
    {
        ... //another y coordinate
    }
    else //If the item is not in any of the previous ranges it's y coordinate is set to 0
    {
        setPos(0,y()); //I had expected the item to go to y = 0 on the scene not the boundingRect()
    }

}

Сцена имеет разрешение 880 на 860, а boundingRect() устанавливается следующим образом:

QRectF QGraphicsItem::boundingRect() const
{
    return QRectF(780,425,60,30);
}

person AlarmingMonkey    schedule 05.01.2016    source источник


Ответы (1)


Ограничивающий прямоугольник элемента определяет элемент в его локальных координатах, тогда как для установки его положения на сцене используются координаты сцены.

Например, давайте создадим каркас класса Square, производного от QGraphicsItem.

class Square : public QGraphicsItem
{
    Q_OBJECT
public:

    Square(int size)
        : QGraphicsItem(NULL) // we could parent, but this may confuse at first
    {
        m_boundingRect = QRectF(0, 0, size, size);
    }

    QRectF boundingRect() const
    {
        return m_boundingRect;
    }

private:
    QRectF m_boundingRect;
};

Мы можем создать квадрат с шириной и высотой 10

Square* square = new Square(10);

Если элемент добавлен к QGraphicsScene, он появится в левом верхнем углу сцены (0, 0);

pScene->addItem(square); // assuming the Scene has been instantiated.

Теперь мы можем переместить square в сцене...

square->setPos(100, 100);

square будет двигаться, но его ширина и высота по-прежнему равны 10 единицам. Если ограничивающий прямоугольник square изменяется, то сам прямоугольник изменяется, но его положение в сцене остается прежним. Давайте изменим размер square...

void Square::resize(int size)
{
    m_boundingRect = QRectF(0, 0, size, size);
}

square->resize(100);

square теперь имеет ширину и высоту 100, но его положение такое же, и мы можем перемещать square отдельно от его определенного ограничивающего прямоугольника.

square->setPos(200, 200);

Что я хочу сделать, так это переместить весь QGraphicsItem в заданную координату.

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

person TheDarkKnight    schedule 05.01.2016