Qt 5.10 QGraphicsView 无法将 QGraphicsScene 缩放到全屏

Qt 5.10 QGraphicsView cannot scale QGraphicsScene to fullscreen

我正在 Ubuntu 16.04 上尝试使用 Qt 5.10 QMultimedia 播放 Gstreamer 录制的视频。应用程序的内容如下所示。在我调用 showMaximized() 后,我似乎无法让视频缩放到整个 Qt 屏幕。

屏幕中间显示的小视频如下图(我想让它缩放到整个window):

代码:

#include "mainwindow.h"

#include <QVideoWidget>
#include <QGraphicsView>
#include <QtMultimedia>
#include <QGraphicsVideoItem>
#include <unistd.h>
#include <QTimer>
#include <QDebug>


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{

    QGraphicsView * graphicsView = new QGraphicsView;
    QGraphicsScene * scene = new QGraphicsScene;
    QGraphicsVideoItem *item = new QGraphicsVideoItem;

    //graphicsView->setGeometry(0,0,640,480); // One size shows up... attempt #1
    graphicsView->setGeometry(0,0,640*2,480*2); // This does nothing to video size?

    graphicsView->setScene(scene);
    graphicsView->scene()->addItem(item);
    graphicsView->setRenderHints( QPainter::Antialiasing );

    scene->setSceneRect(scene->itemsBoundingRect());
    graphicsView->setSceneRect(scene->sceneRect());

    // Media Player
    player = new QMediaPlayer;
    player->setVideoOutput(item);
    player->setMedia(QUrl::fromLocalFile("/tmp/test.mkv"));
    player->play();

    qDebug() << "Started Playing";

    // Show full screen
    //graphicsView->showFullScreen();
    graphicsView->showMaximized();

}

QGraphicsView中处理了2种坐标,第一种是像素的物理坐标,另一种是用物品处理的坐标系,即QGraphicsView 作为widget 与场景的坐标系不同。为了便于理解,我将使用以下示例:假设您有一台相机并且正在录制电影,现实世界有一个坐标系,但相机也有另一个不匹配但有一定坐标系的坐标系将它们联系起来的转换,例如演员接近相机,他的物理高度没有改变,但如果它发生了变化,从相机看起来的高度。在前面的示例中,相机是 QGraphicView,世界是 QGraphicScene,演员和元素是项目。所以即使我买了一台分辨率更高的相机,演员也不会长大,而这就是你所做的。可以做的一件事是调整相机的焦点,以便只有演员可以看到,这与使用 fitInView() 相同,但这是当场景大小发生变化时你应该做的,以便它自行调整, 所以我们必须使用 QGraphicScenesceneRectChanged 信号 :

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