Qt5 C ++ QGraphicsView: изображения не соответствуют рамке вида

Я работаю над программой, которая показывает пользователю какую-то картинку, которую он выбрал. Но есть проблема, потому что я хотел бы разместить эту картинку в QGraphicsView 'Рамка и картинка действительно меньше рамки.

Так вот'мой код:

image = new QImage(data.absoluteFilePath()); // variable data is defined when calling this method
scn = new QGraphicsScene(this); // object defined in header
ui->graphicsView->setScene(scn);
scn->addPixmap(QPixmap::fromImage(*image));
ui->graphicsView->fitInView(scn->itemsBoundingRect(),Qt::KeepAspectRatio);

Я пробовал много решений, которые я нашел в Интернете, но никто не сделалмне не поможет Размер изображения составляет около 40 x 60 пикселей, а размер кадра - 200 x 400 пикселей. Что может быть не так?

Вот некоторый пример того, что производится с кодом выше и что я хочу получить:

 WoJo11 июн. 2013 г., 10:50
да, вы не можете использовать QLabel setPixmap ()
 user125725510 июн. 2013 г., 21:44
Пожалуйста, посмотрите отредактированный вопрос. Спасибо!
 user125725511 июн. 2013 г., 15:03
Как насчет подгонки изображения под размер QLabel? Я смотрел на scaledContents и он только масштабировал изображение без сохранения соотношения ...
 Thomas Ayoub11 июн. 2013 г., 08:58
Я знаю это'это не проблема, но если вы растянете фотографии так много, ябудет немного некрасиво ... более того, вы хотите сохранить соотношение сторон, которое не совпадает (картинка 2/3 & кадр 1/2 ...) Может с 200 * 300 рамкой?
 Pavel Strakhov10 июн. 2013 г., 21:17
Я могу'воспроизвести это поведение. Изображение отлично масштабируется.
 user125725511 июн. 2013 г., 09:56
Есть ли какое-либо другое решение, встроенное в QGraphicsView для отображения изображения внутри диалога?

Ответы на вопрос(3)

Решение Вопроса

чает, что вы можетеВызвать fitInView () до показа формы, поэтому вам нужно создать showEvent () для диалога, и изображение будет встроено в QGraphics View 'кадр.

И пример кода, который вы должны добавить в диалогкод:

void YourClass::showEvent(QShowEvent *) {
    ui->graphicsView->fitInView(scn->sceneRect(),Qt::KeepAspectRatio);
}
 mannysz16 авг. 2013 г., 23:30
Иисус Христос! Спасибо, мужик! Я'Вы искали всю документацию Qt, чтобы попытаться понять проблему, и у нее нет ссылки на эту проблему!
 mannysz22 авг. 2013 г., 19:24
После этого у меня возникла проблема, как вы решили проблему с границей белого пикселя? У меня есть QDeclarativeView (который является GraphicsView) и пытаюсь подогнать InView для сцены () ->itemsBoundingBox (), что приводит к 1920x1080 пикселей. Хотя он остается с белой рамкой 5 пикселей (из-за цвета фона сцены). Если я делаю setAlign (Qt :: Left | Qt :: Top), отображается только нижнее правое поле. Есть намеки?

по которой выВы не видите свое изображение так, как хотите, потому что функция QInraphicsView fitInView не делает то, что вы думаете.

Это гарантирует, что объект помещается внутри области просмотра, без какого-либо перекрытия границ вида, поэтому, если ваш объект не был в представлении, вызов fitInView заставит представление перемещаться / масштабироваться и т.д., чтобы гарантировать, что объект полностью виден. Кроме того, если область просмотра слишком мала для области, предоставленной для fitInView, ничего не произойдет.

Итак, чтобы получить то, что вы хотите, сопоставьте экстенты координат GraphicsView с GraphicsScene, а затем установите изображение 'Сцена координаты тех. Как сказал @VBB, если вы растянете изображение, это может изменить формат изображения, поэтому вы можете использовать scaledToWidth на QPixmap.

Что-то вроде этого: -

QRectF sceneRect = ui->graphicsView->sceneRect(); // the view's scene coords
QPixmap image = QPixmap::fromImage(*image);

// scale the image to the view and maintain aspect ratio
image = image.scaledToWidth(sceneRect.width());

QGraphicsPixmapItem* pPixmap = scn->addPixmap(QPixmap::fromImage(*image));

// overloaded function takes the object and we've already handled the aspect ratio
ui->graphicsView->fitInView(pPixmap);

Вы можете обнаружить, что вы нене нужен вызов fitInView, если ваш видовой экран находится в нужном месте и если вы неЧтобы изображение было пиксельным, используйте изображение с высоким разрешением.

Вы должны справитьсяизменить размер событие, я думаю, этотак оно и естьs предназначено для игры:

bool YourDialog::eventFilter(QObject *obj, QEvent *event)
{
        if (event->type() == QEvent::Show){
            ui->conceptView->fitInView(conceptScene->sceneRect(), Qt::KeepAspectRatio);
        }

        if (event->type() == QEvent::Resize){
            ui->conceptView->fitInView(conceptScene->sceneRect(), Qt::KeepAspectRatio);
        }
}

Ваш ответ на вопрос