代码之家  ›  专栏  ›  技术社区  ›  PhilBot

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

  •  1
  • PhilBot  · 技术社区  · 6 年前

    我正在ubuntu16.04上试用qt5.10qmultimedia来播放Gstreamer录制的视频。应用程序的具体内容如下所示。调用showMaximized()后,我似乎无法将视频缩放到整个Qt屏幕。

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

    enter image description here

    #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 回复  |  直到 6 年前
        1
  •  1
  •   eyllanesc Yonghwan Shin    6 年前

    QGraphicsView 处理两种类型的坐标,第一种是像素的物理坐标,另一种是用项目处理的坐标,即项目的坐标系 QGraphicsView视图 因为小部件不同于场景的坐标系。为了让你理解,我将使用下面的例子:假设你有一个相机,你正在录制一部电影,现实世界有一个坐标系,但相机也有另一个不匹配的坐标系,但有一个特定的变换,将它们联系起来,例如一个演员靠近相机,他的身体高度没有改变,但从相机上看的高度如果改变了。在上一个示例中,摄影机是 QGraphicView QGraphicScene ,而参与者和元素就是项目。所以即使我买了一台分辨率更高的相机,演员也不会长大,你就是这么做的。可以做的一件事就是调整相机的焦距,这样只有演员才能看到,这和使用相机是一样的 fitInView() ,但当场景的大小发生变化时,您应该这样做,以便它可以自行调整,因此我们必须使用 sceneRectChanged QGraphics场景

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