QGraphicsView Scrollen und Bildskalierung / Zuschneiden
-
21-09-2019 - |
Frage
Ich mag ein Hintergrundbild in meinem QGraphicsView haben, die immer skaliert wird (und abgeschnitten, wenn nötig) auf die Größe des Ansichtsfensters, ohne Scrollbalken und ohne mit der Tastatur und Maus zu scrollen. Das folgende Beispiel ist das, was ich tue, um ein Bild im Ansichtsfenster zu skalieren und beschneiden, aber ich bin mit zufälligen Werten für das Zuschneiden, die des Äthers herausgezogen werden. Ich würde eine logische Lösung gefällt?
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 einen Weg Skala kennen und ein Bild auf die Größe des QGraphicsView zuzuschneiden, die auch funktioniert, wenn ich die QGraphicsView ändern. Wo werden aus dem 1,5 und 19 kommen?
EDIT; Ich habe auch auf den Einsatz setBackgroundBrush versucht, aber ich einen gekachelten Hintergrund bekommen, auch bei der Verwendung der skalierte / geerntete QImage / QPixmap.
EDIT; Meine Lösung ist bisher DrawBackground () außer Kraft setzt das Ergebnis wollte ich zu bekommen, aber das ist immer noch nicht hilft mir lernen, wie man Größe ein Bild in die Darstellungsgröße eines QGraphicsView. Darüber hinausgehende Antworten würden sehr geschätzt werden.
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()));
}
Lösung
Sie wollen sceneRect
nicht nur width
und height
. Für die Skalierung auf Größe ändern möchten, dass Sie einen Schlitz sceneRectChanged
verbinden, so können Sie die Größe des Bildes, wenn die Szenengröße ändert.
Sie können auch eine QGraphicsView
ableiten mit einer überschriebenen updateSceneRect
, dass Änderungen der Bildgröße, oder besser noch, nur außer Kraft setzen drawBackground
.
Andere Tipps
fand ich ui->graphicsView->viewport()->size()
die Darstellungsgröße zu erhalten. Nur funktioniert nach dem Widget obwohl worden ist gezeichnet.
Die QGraphicsView::fitInView
tut genau dies. Gemäß der Dokumentation ist es allgemein in einem resizeEvent
setzen. Mit sceneRects
macht die gesamte Szene passen in die Ansicht:
void CustomGraphicsView::resizeEvent(QResizeEvent *)
{
this->fitInView(this->sceneRect());
}