Qt QGraphicsScene::setSceneRect() 实际上并没有设置场景 rect

Qt QGraphicsScene::setSceneRect() doesn't actually set the scene rect

本文关键字:设置 并没有 rect QGraphicsScene setSceneRect Qt 实际上      更新时间:2023-10-16


我已经实现了一个简单的图像查看器小部件。它工作正常,但是当我尝试上传图片然后用较小的图片替换它时,它没有居中。我做了一些小研究,发现问题出在QGraphicsScene sceneRect上。所以我编写了一些代码来重置它,每次在上传图像之前。我还在行之间放了一些qDebug()的东西,以确保它确实将此矩形设置为 null。不幸的是,即使在调用此setSceneRect()函数后,它仍然保持不变。以下是一些代码,可以更好地理解我的问题:

void function_which_uploads_and_show_images()
{
    QString file_path = QFileDialog::getOpenFileName(this, "title", "/", "*.jpg");
    this->image = QPixmap(file_path);
    this->scene->clear();
    this->scene->setSceneRect(QRectF()); //setting sceneRect to the null rect
    // here goes some code to scale the image if necessary
    this->scene->addPixmap(file_path);
}

我的问题是:如何重置 sceneRect 以便每次上传图像时它都会居中?

您只提供了有关图像如何真正"自动"居中的部分代码。您可能需要研究诸如QGraphicsLayout之类的东西来管理定位。

但要解决这个问题,您可以尝试将场景设置为视图的直角。您可能只需要在初始化时执行一次。

QGraphicsView::sceneRect文档:

场景

矩形定义场景的范围,在视图的情况下,这意味着可以使用滚动条导航的场景区域。

如果未设置,

或者设置了空 QRectF,则此属性的值与 QGraphicsScene::sceneRect 相同,并且随 QGraphicsScene::sceneRect 一起更改。否则,视图的场景矩形不受场景的影响。

默认情况下,此属性在原点包含一个宽度和高度为零的矩形。

也许这不是这个问题的一个非常干净的解决方案,但可以执行以下操作来重置场景 rect:

scene = new QGraphicsScene(this);
view->addScene(scene);

它有效,但我几乎可以肯定它可以以另一种方式实现,所以如果你对这个问题有更好的答案,请在这里发布。