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

Posted

技术标签:

【中文标题】Qt 5.10 QGraphicsView 无法将 QGraphicsScene 缩放到全屏【英文标题】:Qt 5.10 QGraphicsView cannot scale QGraphicsScene to fullscreen 【发布时间】:2018-10-03 00:30:27 【问题描述】:

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

屏幕中间显示的小视频如下图(我希望它缩放到整个窗口):

代码:

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


【问题讨论】:

【参考方案1】:

QGraphicsView中处理了2种坐标,第一种是像素的物理坐标,另一种是与items一起处理的,即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();

【讨论】:

以上是关于Qt 5.10 QGraphicsView 无法将 QGraphicsScene 缩放到全屏的主要内容,如果未能解决你的问题,请参考以下文章

Qt 5.2 和 5.10 上 OpenGL 的差异

Qt QGraphicsView不显示场景

QT软件开发: 将QGraphicsView视图界面保存为图片

moc在Docker容器中使用Qt 5.10的“未定义接口”失败

如何在 QT 中的 QgraphicsView 中保持图像原始

QT中QGraphicsView中的手指滚动?