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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du willst
sceneRect
nicht nurwidth
undheight
. Für die Skalierung auf die Größe, die Sie möchten, schließen Sie einen slot, umsceneRectChanged
so können Sie die Größe des Bildes, Wann immer die Szene mit der änderung der Größe.Oder Sie können daraus einen
QGraphicsView
mit einer überschriebenenupdateSceneRect
, dass Veränderungen der Bildgröße, oder noch besser, einfach überschreibendrawBackground
.InformationsquelleAutor Adam W
Fand ich
ui->graphicsView->viewport()->size()
um die viewport-Größe. Funktioniert allerdings nur, wenn das widget gezogen wurde obwohl.InformationsquelleAutor Jamie Love
Den
QGraphicsView::fitInView
tut genau dies. Laut der Dokumentation ist es Häufig in einemresizeEvent
. MitsceneRects
macht die gesamte Szene passen, in den Blick:InformationsquelleAutor richelbilderbeek