QGraphicsView Scrollen und Skalieren / Zuschneiden von Bildern

Ich möchte ein Hintergrundbild in meiner QGraphicsView haben, das immer auf die Größe des Ansichtsfensters skaliert (und bei Bedarf zugeschnitten) wird, ohne Bildlaufleisten und ohne Scrollen mit Tastatur und Maus. Das folgende Beispiel zeigt, wie ich ein Bild im Ansichtsfenster skaliere und beschneide, aber ich verwende zufällige Werte für das Beschneiden, die aus dem Äther gezogen werden. Ich hätte gerne eine logische Lösung?

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);
}

Ich möchte eine Möglichkeit kennen, ein Bild zu skalieren und auf die Größe von QGraphicsView zuzuschneiden, die auch dann funktioniert, wenn ich die Größe von QGraphicsView verändere. Woher kommen die 1.5 und 19?

BEARBEITEN; Ich habe auch versucht, setBackgroundBrush zu verwenden, aber ich erhalte einen gekachelten Hintergrund, auch wenn ich die skalierte / beschnittene QImage / QPixmap verwende.

BEARBEITEN; Bisher bestand meine Lösung darin, drawBackground () zu überschreiben, um das gewünschte Ergebnis zu erzielen. Dies hilft mir jedoch nicht dabei, die Größe eines Bilds auf die Ansichtsfenstergröße einer qgraphics-Ansicht anzupassen. Für weitere Antworten wäre ich sehr dankbar.

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()));

}

Antworten auf die Frage(3)

Ihre Antwort auf die Frage