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

}
War es hilfreich?

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());
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top