Я хотел бы иметь фоновое изображение в моем 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()));
}