2010-03-22 12 views
5

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

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 wissen, um ein Bild der Größe des QGraphicsView zu skalieren und zu beschneiden, die auch funktioniert, wenn ich die QGraphicsView ändern. Woher kommen die 1.5 und 19?

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

BEARBEITEN; Meine Lösung war bisher, drawBackground() zu überschreiben, um das gewünschte Ergebnis zu erhalten, aber das hilft mir immer noch nicht dabei, wie man ein Bild auf die Ansichtsfenstergröße einer qgraphicsview einstellt. Alle weiteren 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())); 

} 

Antwort

1

Sie wollen sceneRect nicht nur width und height. Für die Skalierung bei der Größenänderung möchten Sie einen Slot an sceneRectChanged anschließen, so dass Sie die Größe des Bildes ändern können, wenn die Szene die Größe ändert.

Oder Sie können eine QGraphicsView mit einem überschrieben updateSceneRect ableiten, die die Bildgröße ändert, oder noch besser, überschreiben Sie einfach drawBackground.

+0

Aus der Dokumentation: „Die Szene rect das Ausmaß der Szene definiert, und im Fall der Ansicht, bedeutet dies den Bereich der Szene, die Sie navigieren können mit die Bildlaufleisten. " sceneRect ist nicht das, was ich will, das gibt mir die Größe der Szene, unabhängig davon, wie groß die Ansichtsfenster-Dimensionen sind. Ich möchte die Größe des Darstellungsbereichs. Ich möchte ein Bild auf diese Dimensionen skalieren. Das scheint einfach zu sein; Nimm die Breite/Höhe der qgraphicsview und der Job sollte erledigt werden. Aber die Breite und Höhe sind nicht korrekt, wenn ich ein Bild auf diese Größe skaliere: Was ist der fehlende Teil hier? Ich werde DrawBackground versuchen. – user298725

0

Ich fand ui->graphicsView->viewport()->size(), um die Größe des Ansichtsfensters zu erhalten. Funktioniert nur, nachdem das Widget gezeichnet wurde.

0

Die QGraphicsView::fitInView macht genau dies. Gemäß der Dokumentation wird es üblicherweise in eine resizeEvent gelegt. Mit sceneRects macht die gesamte Szene paßt in die Ansicht:

void CustomGraphicsView::resizeEvent(QResizeEvent *) 
{ 
    this->fitInView(this->sceneRect()); 
}