我在尝试将场景的内容(拉伸)放入我的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进行了测试,我桌面上的所有这些分辨率都显示内容存在同样的问题。即使在全屏模式下,它也会保留小白边。
为了确保内容中没有任何内容,我将视图的背景画笔设置为黑色,白色边框变为黑色(换句话说,内容缩小太多以适应视图)。
根据内容大小改变背景部分,从矩形硬编码中减去值不是一个选项。 (它应该动态调整)。
有什么建议吗?
答案 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);
}
让它变得特别丑陋的是,有时它不是必需的,而且事情正常,请小心区分这些情况。