c++qtmultimediaqtmultimediaqvideowidget

QVideoWidget doesn't resize well


I have a Qt application which simply captures from the default webcam and shows it on a QVideoWidget. In the ui, I have a simple MainWindow with a QGraphicsView inside a VerticalLayout:

ui design

My mainwindow.cpp=============================================

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    m_viewfinder = new QVideoWidget(ui->captureView);
    m_camera = new QCamera(QCameraInfo::defaultCamera());
    m_camera->setViewfinder(m_viewfinder);

    m_camera->start();
}

MainWindow::~MainWindow()
{
    m_camera->stop();
    delete m_viewfinder;
    delete m_camera;
    delete ui;
}

When I execute this, I get the application running, but the video contents do not scale according to the mainwindow size. Examples:

When I start the application

Resizing mainwindow down

Resizing mainwindow up

Is there some way to make the video content resize well and fit the available area? I have seen this answer: QVideoWidget: Video is cut off, but it doesn't offer any solution that works for me. When use the QGraphicsView-QGraphicsScene-QGraphicsVideoItem chain, I see nothing at all.


Solution

  • When you use the following instruction:

    m_viewfinder = new QVideoWidget(ui->captureView);
    

    You are setting as the parent of m_viewfinder to captureView, so the positions of m_viewfinder will be relative to captureView, but this does not indicate that it will be the same size as the parent.

    One of the easiest ways to do this is to use a layout. Also, it is not necessary to create the QGraphicsWidget or the QVBoxLayout, so I recommend you to delete it and get the design as it was established by default:

    enter image description here

    and then we establish a layout that is placed in the centralWidget, and in this layout we add the QVideoWidget.

    ...
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        m_viewfinder = new QVideoWidget;
        QVBoxLayout *lay = new QVBoxLayout(ui->centralWidget);
        lay->addWidget(m_viewfinder);
        m_camera = new QCamera(QCameraInfo::defaultCamera());
        m_camera->setViewfinder(m_viewfinder);
    
        m_camera->start();
    }
    ...
    

    In the following link you can find the complete example.