这可能是一个转储问题,但我现在真的坚持了。我试图在QGraphicsScene中绘制一些正方形,并且我希望它们从位置x = 0朝向x坐标的正位置对齐。但是它们根据QGraphicsView的对齐配置进行对齐,并且位置设置仅对第二项有效,相对于第一项有效!这意味着如果我有一个项目,那么设置它的位置就没有效果了。主要是这条线似乎不起作用:
graphicsView->setAlignment(Qt::AlignAbsolute);
这是我的代码:
QGraphicsScene *scene = new QGraphicsScene();
QGraphicsView *graphicsView;
graphicsView->setScene(scene);
graphicsView->setAlignment(Qt::AlignAbsolute);
for(int i = 0; i < 500; i+= 50)
{
QGraphicsPolygonItem *item = new QGraphicsPolygonItem();
item->setPen(QPen(QColor(qrand()%255,qrand()%255,qrand()%255)));
item->setBrush(QBrush(QColor(255,251,253)));
item->setPolygon(*myPolygon);
graphicsView->scene()->addItem(item);
item->setPos(i , 40);
item->setFlag(QGraphicsItem::ItemIsMovable, true);
item->setFlag(QGraphicsItem::ItemIsSelectable, true);
graphicsView->show();
}
我不知道问题可能是什么,所以我尝试了以下代码
const QRectF rect = QRectF(0, 0, ui->graphicsView->width(), ui->graphicsView->height());
ui->graphicsView->setScene(&_scene);
ui->graphicsView->fitInView(rect, Qt::KeepAspectRatio);
ui->graphicsView->setSceneRect(rect);
对于前四行,以下输出不会产生相互接近的尺寸:
qDebug() << "scene =>" << _scene.width() << _scene.height();
qDebug() << "graphicview =>" << ui->graphicsView->width() << ui->graphicsView->height();
我非常感谢你的帮助。
答案 0 :(得分:2)
似乎Qt::AlignAbsolute
没有按照你的假设做到。你真正需要的是Qt::AlignLeft | Qt::AlignTop
。
这里解释: http://qt-project.org/doc/qt-4.8/qgraphicsview.html#alignment-prop http://qt-project.org/doc/qt-4.8/qt.html#AlignmentFlag-enum
在我的代码中,我只使用graphicsView->setSceneRect(rect);
而不是fitInView()
。后者引入了扩展,可能会阻碍您对出现问题的理解。
基本上,我覆盖了QGraphicsview以重新实现resizeEvent()
:
void AutohideView::resizeEvent(QResizeEvent *event)
{
/* always resize the scene accordingly */
if (scene())
scene()->setSceneRect(QRect(QPoint(0, 0), event->size()));
QGraphicsView::resizeEvent(event);
}
在定位项目时,我不会更改对齐或任何其他选项,并使用[0
,0
.. scene()->width()
,scene()->height()
]范围内的绝对坐标。