Qt 4.8.5中QGraphicsView::fitInView无法完全适应问题

3

我有一个问题,尝试将场景的内容(拉伸)适应我的QDeclarativeView。我以常规方式加载QML文件。我用下面的代码重写了showEvent和resizeEvent方法:

QGraphicsItem* rootItem = this->scene()->items.at(0);
QRectF rootRect = rootItem->sceneBoundingRect(); // it gives me a QRectF(0,0,1920,1080)
this->fitInView(rootRect, Qt::IgnoreAspectRatio); // Aspect doesn't matters.

问题在于它一直显示着内容周围的一个小白边(几乎4像素)。我已经在1920x1080、1920x1200和1440x900三种分辨率下进行了测试,我的桌面上所有这些分辨率都显示出同样的问题。即使在全屏模式下也保留了小白边。
为了确保这不是内容的问题,我将视图的背景画刷设置为黑色,白色边框变成了黑色(换句话说,内容被缩小得太多以适应视图)。
从硬编码中减去矩形值不是一个选项,因为它根据内容大小变化背景部分。(它应该动态适应)。
有什么建议吗?

抱歉,我之前遇到过类似的问题,无论场景颜色如何,如果视图设置为显示整个场景,则会显示边框,这实际上是来自承载视图的窗口。我以为这可能是同样的问题。 - TheDarkKnight
你解决了这个问题吗?我也遇到了同样的问题。 - Tarantula
你尝试过将项的笔设置为cosmetic,可能还将笔的宽度设置为0吗?在渲染方面,Qt5与Qt4工作方式不同,但我认为它也计算到了项的形状矩形中。 - redteam316
尚未解决。已在Qt 5.0上重写代码。正在尝试修复源代码并向Qt开发团队推送解决方案。 - mannysz
1
这个问题已经有一个错误报告了(QTBUG-11945)。 - mannysz
显示剩余4条评论
2个回答

2

我也遇到了这个问题。由于该bug还没有被解决,我将发布我的部分解决方案。我子类化了QGraphicsView并添加了一个方法myFitInView(),自动执行所需的缩放和居中。

我猜如果你需要更好的性能,也可以直接填充矩阵,但是我不需要这样做,因此分别进行缩放和居中。

此外,使用这种方法会丢失任何以前的视图变换,但是您可能也可以根据当前矩阵进行相应的修改/乘法来考虑这一点。

void MyGraphicsView::myFitInView(QRectF const &rect)
{
  QRectF viewRect = frameRect();

  double scaleX = viewRect.width() / rect.width();
  double scaleY = viewRect.height() / rect.height();

  QTransform trans;
  trans.scale(scaleX, scaleY);
  setTransform(trans, false);

  centerOn(rect.width() / 2, rect.height() / 2);
}

1
这是一个优雅的解决方案。虽然我想在两年前的代码上测试它,当时我遇到了这个问题。该项目已迁移到Qt 5.2,并且在此版本上不会出现此问题。我接受它作为正确答案。 - mannysz
2
我正在使用Qt 5.4.1,并遇到了完全相同的问题。 - B3ret
1
这在5.2.0上不会发生(我们不再更新它)。你应该尝试一下。你确定这不是一个上下文问题吗?你正在使用新的OpenGL场景图吗? - mannysz

1

似乎是Qt的一个bug: https://bugreports.qt-project.org/browse/QTBUG-11945。 我丑陋的解决方法是

QRectF removeMargin11945(const QRectF& sceneRect, const QSize& viewerSize){
    const int bugMargin = 2;
    const double mx = sceneRect.width()/viewerSize.width()*bugMargin;
    const double my = sceneRect.height()/viewerSize.height()*bugMargin;
    return sceneRect.adjusted(mx, my, -mx, -my);
}   

有时候它并非必需,但事情仍能正常运行,要小心区分这些情况,否则会显得很丑陋。

解决方案必须适用于多种分辨率和纵横比,因此一旦边距固定将不可接受。边距不是恒定的,而是取决于分辨率。 - mannysz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接