这可能是一个转储问题,但我现在真的很困惑。我正在尝试在 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();
非常感谢您的帮助。
最佳答案
看来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()
] 放置我的元素时。
关于c++ - Qt - 使用绝对位置将项目添加到 QGraphicsScene,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24460084/