2010-03-22 8 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?

EDIT; Я также попытался использовать setBackgroundBrush, но я получаю черепичный фон даже при использовании масштабированного/обрезанного QImage/QPixmap.

EDIT; Мое решение до сих пор заключалось в том, чтобы переопределить 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 не только width и height. Для масштабирования при изменении размера вы хотите подключить слот к sceneRectChanged, чтобы вы могли изменять размер изображения при изменении размера сцены.

Или вы можете получить QGraphicsView с переопределенным updateSceneRect, который изменяет размер изображения или, еще лучше, просто переопределяет drawBackground.

+0

Из документации: «Прямоугольник сцены определяет протяжённость сцены, а в случае, если вид, это означает, что область сцены, что вы можете перемещаться с помощью полосы прокрутки ". sceneRect - это не то, что я хочу, это дает мне размер сцены, независимо от размеров видовых экранов. Я хочу размеры видового экрана. Я хочу изменить размер изображения. Это кажется простым; захватить ширину/высоту qgraphicsview и выполнить задание. Но ширина и высота неправильны, когда я масштабирую изображение до такого размера: какая здесь недостающая часть? Я попробую drawBackground. – user298725

0

Я нашел ui->graphicsView->viewport()->size(), чтобы получить размер видового экрана. Работает только после того, как виджет был нарисован.

0

QGraphicsView::fitInView делает именно это. Согласно документации, она обычно помещается в resizeEvent. Использование sceneRects делает всю сцену посадки в поле зрения:

void CustomGraphicsView::resizeEvent(QResizeEvent *) 
{ 
    this->fitInView(this->sceneRect()); 
} 
Смежные вопросы