Qt 4.8.5 QGraphicsView :: fitInView无法完全适合

时间:2013-08-22 17:40:28

标签: c++ qt

我在尝试将场景的内容(拉伸)放入我的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进行了测试,我桌面上的所有这些分辨率都显示内容存在同样的问题。即使在全屏模式下,它也会保留小白边。

为了确保内容中没有任何内容,我将视图的背景画笔设置为黑色,白色边框变为黑色(换句话说,内容缩小太多以适应视图)。

根据内容大小改变背景部分,从矩形硬编码中减去值不是一个选项。 (它应该动态调整)。

有什么建议吗?

2 个答案:

答案 0 :(得分: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 :(得分:1)

似乎是Qt中的一个错误: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);
}   

让它变得特别丑陋的是,有时它不是必需的,而且事情正常,请小心区分这些情况。