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 下进行了测试,我桌面上的所有这些分辨率都显示了具有相同问题的内容。即使在全屏模式下,它也会保留白色的小边框。

只是为了确保它与内容无关,我已将视图的背景画笔设置为黑色,并且白色边框变为黑色(换句话说,内容被缩小太多以适应视图)。

一旦根据内容大小改变背景部分,就不能从矩形硬编码中减去值。(它应该动态适应)。

有什么建议么?

4

2 回答 2

2

刚刚也遇到了问题。由于该错误尚未解决,我将发布我的部分解决方案。我将 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);
}
于 2015-07-01T17:22:35.040 回答
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);
}   

使它特别难看的是,有时它不是必需的,而且一切正常,请小心区分这些情况。

于 2014-01-08T10:51:35.933 回答