我希望在QGraphicsView中有一个背景图像,它总是按比例缩放(并在必要时裁剪)到视口的大小,没有滚动条,也没有用键盘和鼠标滚动。下面的示例是我在视口中缩放和裁剪图像的操作,但我使用随机值进行从以太中拉出的裁剪。我想要一个合乎逻辑的解决方案吗?
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
scene = new QGraphicsScene(this);
ui->graphicsView->resize(800, 427);
// MainWindow is 800x480, GraphicsView is 800x427. I want an image that
// is the size of the graphicsView.
ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// the graphicsView still scrolls if the image is too large, but
// displays no scrollbars. I would like it not to scroll (I want to
// add a scrolling widget into the QGraphicsScene later, on top of
// the background image.)
QPixmap *backgroundPixmap = new QPixmap(":/Valentino_Bar_Prague.jpg");
QPixmap sized = backgroundPixmap->scaled(
QSize(ui->graphicsView->width(),
ui->graphicsView->height()),
Qt::KeepAspectRatioByExpanding); // This scales the image too tall
QImage sizedImage = QImage(sized.toImage());
QImage sizedCroppedImage = QImage(sizedImage.copy(0,0,
(ui->graphicsView->width() - 1.5),
(ui->graphicsView->height() + 19)));
// so I try to crop using copy(), and I have to use these values
// and I am unsure why.
QGraphicsPixmapItem *sizedBackground = scene->addPixmap(
QPixmap::fromImage(sizedCroppedImage));
sizedBackground->setZValue(1);
ui->graphicsView->setScene(this->scene);
}
我想知道一种将图像缩放和裁剪为QGraphicsView大小的方法,即使在我调整QGraphicsView的大小时也能正常工作。 1.5和19来自哪里?
EDIT;我也试图使用setBackgroundBrush,但是我得到了平铺背景,即使使用缩放/裁剪的QImage / QPixmap。
EDIT;到目前为止,我的解决方案是覆盖drawBackground()以获得我想要的结果,但这仍然无法帮助我学习如何将图像调整为qgraphicsview的视口大小。任何进一步的答案将不胜感激。
void CustomGraphicsView::drawBackground( QPainter * painter, const QRectF & rect )
{
qDebug() << "background rect: " << rect << endl;
QPixmap *backgroundPixmap = new QPixmap(":/Valentino_Bar_Prague.jpg");
QPixmap sized = backgroundPixmap->scaled(QSize(rect.width(), rect.height()), Qt::KeepAspectRatioByExpanding);
painter->drawPixmap(rect, sized, QRect(0.0, 0.0, sized.width(), sized.height()));
}
答案 0 :(得分:1)
您希望sceneRect
不仅仅是width
和height
。对于调整大小时的缩放,您希望将插槽连接到sceneRectChanged
,这样您就可以在场景改变大小时调整图像大小。
或者您可以使用覆盖updateSceneRect
的QGraphicsView
派生更改图片大小,或者更好的是,只需覆盖drawBackground
。
答案 1 :(得分:0)
我找到ui->graphicsView->viewport()->size()
来获取视口的大小。仅在小部件被绘制后才有效。
答案 2 :(得分:0)
QGraphicsView::fitInView
就是这样做的。根据文档,它通常放在resizeEvent
中。使用sceneRects
可使整个场景适合视图:
void CustomGraphicsView::resizeEvent(QResizeEvent *)
{
this->fitInView(this->sceneRect());
}