2016-01-05 4 views
0

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


Ниже приведен код, который я написал. Но этот код только устанавливает положение формы, которую я нарисовал в пределах 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); 
} 

ответ

0

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

Например, давайте создадим скелет 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, который будет перемещать пункт относительно любого родителя, или если родитель не существует, он будет перемещать его относительно сцены.