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 px, когда рамка 200 x 400 px. Что может быть не так?

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

3 ответов


решение для моего вопроса-Showevent () для диалога. Это означает, что вы не можете вызвать fitInView() до отображения формы, поэтому вам нужно создать showevent() для диалога, и изображение будет помещено в кадр Qgraphics View.

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

void YourClass::showEvent(QShowEvent *) {
    ui->graphicsView->fitInView(scn->sceneRect(),Qt::KeepAspectRatio);
}

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

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

Итак, чтобы получить то, что вы хотите, сопоставьте экстенты координат GraphicsView с GraphicsScene, а затем установите координаты сцены изображения на них. Как сказал @VBB, если вы растянете изображение, оно может изменить аспект raio, поэтому вы можете использовать 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, если ваш видовой экран находится в нужном месте, и если вы не хотите, чтобы он выглядел пиксельным, использовать изображение с высоким разрешением.


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

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