Нужно в режиме редактирования рисовать сетку на сцене, поверх которой будут размещаться элементы и выравниваться по ней.
Как сделать грамотно сетку, я делал так
QList<QGraphicsLineItem*> * fhorizontalLines;
QList<QGraphicsLineItem*> * fverticalLines;
void QEditorScene::removeGrid()
{
QGraphicsLineItem * item;
for(QList<QGraphicsLineItem*>::iterator it = fhorizontalLines->begin(); it!= fhorizontalLines->end(); it++)
{
item = *it;
this->removeItem(item);
delete item;
}
for(QList<QGraphicsLineItem*>::iterator it = fverticalLines->begin(); it!= fverticalLines->end(); it++)
{
item = *it;
this->removeItem(item);
delete item;
}
fhorizontalLines->clear();
fverticalLines->clear();
}
void QEditorScene::createGrid(int xmax, int x_step, int ymax, int y_step)
{
QPen pen;
QColor gridColor = Qt::white;
gridColor.setAlpha(100);
pen.setColor(gridColor);
pen.setWidthF(0.25);
int xoffset = xmax / x_step;
for(int i=0;i<xmax;i+=xoffset)
{
QGraphicsLineItem * item = this->addLine(i,0,i,ymax,pen);
item->setFlags(QGraphicsItem::ItemStacksBehindParent);
item->setZValue(-3000);
fverticalLines->push_back(item);
}
int yoffset = ymax / y_step;
for(int i=0;i<ymax;i+=yoffset)
{
QGraphicsLineItem * item = this->addLine(0,i,xmax,i,pen);
item->setFlags(QGraphicsItem::ItemStacksBehindParent);
item->setZValue(-3000);
fverticalLines->push_back(item);
}
int offset = yoffset/2;
gridColor = Qt::magenta;
gridColor.setAlpha(150);
pen.setColor(gridColor);
pen.setWidthF(0.25);
for(int i=offset;i<(ymax-offset);i+=yoffset)
{
QGraphicsLineItem * item = this->addLine(0,i,xmax,i,pen);
item->setFlags(QGraphicsItem::ItemStacksBehindParent);
item->setZValue(-3000);
fverticalLines->push_back(item);
}
}
где x_max, y_max - фиксированная ширина сцены,
x_step,y_step - шаг сетки.
Пробовал сначала в drawBackground - но уж очень тормозит при скролле и скалинге.