2010-03-22 196 views
5

我想在我的QGraphicsView中有一個背景圖像,它總是按比例縮放(如果需要裁剪)到視口的大小,沒有滾動條,也不用滾動鍵盤和鼠標。下面的示例是我在縮放和裁剪視口中的圖像時所做的工作,但是我使用從以太網中拔出的裁剪的隨機值。我想要一個合理的解決方案?QGraphicsView滾動和圖像縮放/裁剪

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

我想知道的方式來擴展和裁剪圖像到的QGraphicsView當我調整的QGraphicsView會甚至工作的大小。 1.5和19從哪裏來?

編輯;我也嘗試使用setBackgroundBrush,但是我得到了平鋪背景,即使使用縮放/裁剪的QImage/QPixmap。

編輯;到目前爲止,我的解決方案是重寫drawBackground()以獲得我想要的結果,但這仍然不能幫助我學習如何將圖像調整爲qgraphicsview的視口大小。任何進一步的答案將不勝感激。

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

} 

回答

1

你想sceneRect不僅僅是widthheight。對於調整縮放比例,您希望將插槽連接到sceneRectChanged,以便在場景更改大小時調整圖像大小。

或者您可以派生一個QGraphicsView,並覆蓋updateSceneRect來改變圖像大小,或者更好的是,只需覆蓋drawBackground

+0

從文檔:「現場RECT定義場景的範圍,並在視圖的情況下,這意味着您可以導航使用場景區域滾動條「。 sceneRect不是我想要的,它給了我場景的大小,而不管視口尺寸是什麼。我想要視口尺寸。我想調整圖像的尺寸。這似乎很簡單;抓住qgraphicsview的寬度/高度並完成工作。但是當我將圖像縮放到這個尺寸時,寬度和高度是不正確的:這裏缺少的部分是什麼? 我會嘗試drawBackground。 – user298725 2010-03-23 03:17:15

0

我找到ui->graphicsView->viewport()->size()來獲得視口的大小。只有在繪製小部件後才能使用。

0

QGraphicsView::fitInView正是如此。根據文件,它通常放在resizeEvent。使用sceneRects使得整個場景配合到視圖:

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