Если вы хотите сохранить ограниченную область, которую вы можете переопределить ItemChanged()
Declare:
#ifndef GRAPHIC_H
#define GRAPHIC_H
#include <QGraphicsRectItem>
class Graphic : public QGraphicsRectItem
{
public:
Graphic(const QRectF & rect, QGraphicsItem * parent = 0);
protected:
virtual QVariant itemChange (GraphicsItemChange change, const QVariant & value);
};
#endif // GRAPHIC_H
реализация: ItemSendsGeometryChanges флаг необходим, чтобы захватить изменение позиции QGraphicsItem
#include "graphic.h"
#include <QGraphicsScene>
Graphic::Graphic(const QRectF & rect, QGraphicsItem * parent)
:QGraphicsRectItem(rect,parent)
{
setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemSendsGeometryChanges);
}
QVariant Graphic::itemChange (GraphicsItemChange change, const QVariant & value)
{
if (change == ItemPositionChange && scene()) {
// value is the new position.
QPointF newPos = value.toPointF();
QRectF rect = scene()->sceneRect();
if (!rect.contains(newPos)) {
// Keep the item inside the scene rect.
newPos.setX(qMin(rect.right(), qMax(newPos.x(), rect.left())));
newPos.setY(qMin(rect.bottom(), qMax(newPos.y(), rect.top())));
return newPos;
}
}
return QGraphicsItem::itemChange(change, value);
}
Затем мы определяем прямоугольник сцены, в этом случае будет 300x300
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
QGraphicsView * view = new QGraphicsView(this);
QGraphicsScene * scene = new QGraphicsScene(view);
scene->setSceneRect(0,0,300,300);
view->setScene(scene);
setCentralWidget(view);
resize(400,400);
Graphic * graphic = new Graphic(QRectF(0,0,100,100));
scene->addItem(graphic);
graphic->setPos(150,150);
}
Это должно держать график в пределах области, удачи
Он работает очень хорошо, ожидайте, что графический элемент можно будет немного потянуть за сцену в правой и нижней области, потому что вы используете верхние левые координаты окна Graphic, чтобы проверить, находится ли объект внутри сцены rect , – danger89
Это могло бы решить эту проблему: http://stackoverflow.com/a/22559758/518879 – danger89