Qt - 使用绝对位置向QGraphicsScene添加项目

时间:2014-06-27 20:12:50

标签: c++ qt

这可能是一个转储问题,但我现在真的坚持了。我试图在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();

我非常感谢你的帮助。

1 个答案:

答案 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);
}

在定位项目时,我不会更改对齐或任何其他选项,并使用[00 .. scene()->width()scene()->height()]范围内的绝对坐标。