Qt QGraphicsScene::setSceneRect() 实际上并没有设置场景 rect
Qt QGraphicsScene::setSceneRect() doesn't actually set the scene rect
我已经实现了一个简单的图像查看器小部件。它工作正常,但是当我尝试上传图片然后用较小的图片替换它时,它没有居中。我做了一些小研究,发现问题出在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);
它有效,但我几乎可以肯定它可以以另一种方式实现,所以如果你对这个问题有更好的答案,请在这里发布。
相关文章:
- 试图对缓存进行跨步测试,但程序并没有结束
- 睡眠:(睡眠或usleep)并没有将我的线程中的所有内容悬挂在Linux中,而是在Windows中悬挂吗?为什么
- C++ std::unique并没有显示我对它的期望
- OpenGL并没有渲染我的立方体
- Qt QGraphicsScene::setSceneRect() 实际上并没有设置场景 rect
- 为什么 C++ std::move 并没有真正对 std::initializer_list 中的元素进行强制转换?右值
- Travis和Coverity扫描 - 一切都在建立,但掩护似乎并没有运行
- 在 c++ 中读取配置文件 json 并没有停止
- 将样本代码重构为类,并没有提高过载功能的实例
- 与C++析构函数相比,C#析构函数和GC并没有真正解决问题
- mac构建有一个未定义的符号,而linux构建并没有用于相同的代码
- 两个功能并没有花时间我期望的,因为它们的复杂性很大,任何人都可以解释原因
- cuda文件并没有链接到C文件中定义的函数
- 将信号从Anthoter非过程中发送到线程,并没有发生记录堆栈
- 我正试图在我的SFML Platformer中实现双跳,但它并没有按预期的方式工作
- C++数组分配并没有真正分配
- 如何设置并开始在Mac上使用谷歌测试框架
- c++中的list不是空的,但并没有可迭代的元素
- 为最简单的项目生成的EclipseCDT构建并没有正确设置include路径
- Cython PXD似乎并没有用于PYX文件