Qt 5.10 QGraphicsView не может масштабировать QGraphicsScene до полноэкранного режима - PullRequest
0 голосов
/ 03 октября 2018

Я экспериментирую с Qt 5.10 QMultimedia на Ubuntu 16.04 для воспроизведения видео, записанных Gstreamer.Мясо приложения показано ниже.Я не могу заставить видео масштабироваться до полного экрана Qt после вызова showMaximized ().

Небольшое видео, показанное в середине экрана, показано ниже (я хочу, чтобы оно масштабировалось до всего окна):

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 Ответ

0 голосов
/ 03 октября 2018

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