【问题标题】:Qt 5.10 QGraphicsView cannot scale QGraphicsScene to fullscreenQt 5.10 QGraphicsView 无法将 QGraphicsScene 缩放到全屏
【发布时间】: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();

}

【问题讨论】:

    标签: linux qt qt5 qtmultimedia


    【解决方案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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多