QGraphicsView scrollen und Bild skalieren/beschneiden

Ich würde gerne ein hintergrund Bild in meinem QGraphicsView, wird immer skaliert (und beschnitten, wenn nötig), um die Größe des Viewports, ohne Scrollbalken und ohne scrollen mit der Tastatur und Maus. Das Beispiel unten ist das, was ich Tue, zu skalieren und beschneiden Sie ein Bild im Ansichtsfenster, aber ich bin mit random Werte für den Beschnitt, die gezogen aus dem äther. Ich möchte 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 würde gerne wissen, eine Möglichkeit zu skalieren und beschneiden eines Bilds an die Größe der QGraphicsView, das funktioniert auch, wenn ich die Größe der QGraphicsView. Wo sind die 1,5 und 19 kommen?

EDIT; ich habe auch versucht, auf setBackgroundBrush, aber ich bekomme einen gekachelten hintergrund, selbst wenn man das skaliert/beschnitten QImage/QPixmap.

BEARBEITEN; Meine Lösung war bisher zu überschreiben drawBackground (), um das Ergebnis bekommen, das ich wollte, aber dies immer noch nicht helfen, mich zu lernen, wie die Größe des Bildes auf die viewport-Größe des qgraphicsview. Weitere Antworten, wäre 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()));

}

InformationsquelleAutor user298725 | 2010-03-22

Schreibe einen Kommentar