В QGraphicsView
обрабатываются 2 типа координат, первый - это физическая координата пикселей, а другой - тот, который обрабатывается с элементами, то есть система координат QGraphicsView
как виджетотличается от системы координат сцены.Чтобы вы поняли, я буду использовать следующий пример: допустим, у вас есть камера и вы записываете фильм, в реальном мире есть система координат, но также у камеры есть другая система координат, которая не соответствует, но есть определеннаяпреобразование, которое связывает их, например, актер приближается к камере, его физическая высота не изменилась, но высота, которая смотрит из камеры, если она изменилась.В предыдущем примере камера - QGraphicView
, мир - QGraphicScene
, а актеры и элементы - это предметы.Так что даже если я куплю камеру с большим разрешением, актер не будет расти, и это то, что вы сделали.Одна вещь, которую можно сделать, это настроить фокус камеры так, чтобы видеть мог только актер, это то же самое, что и fitInView()
, но это то, что вы должны делать, когда сцена изменяется в размерах, чтобы она сама себя настраивала, поэтомумы должны использовать sceneRectChanged
сигнал QGraphicScene
:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QGraphicsView * graphicsView = new QGraphicsView;
setCentralWidget(graphicsView);
QGraphicsScene * scene = new QGraphicsScene(graphicsView);
QGraphicsVideoItem *item = new QGraphicsVideoItem;
// Media Player
player = new QMediaPlayer;
player->setVideoOutput(item);
player->setMedia(QUrl::fromLocalFile("/tmp/test.mp4"));
player->play();
graphicsView->setScene(scene);
graphicsView->scene()->addItem(item);
graphicsView->setRenderHints( QPainter::Antialiasing );
connect(scene, &QGraphicsScene::sceneRectChanged,
[graphicsView, item](const QRectF &)
{
graphicsView->fitInView(item);;
});
showMaximized();
}