QVideoWidget изменяет размер не очень хорошо

У меня есть приложение Qt, которое просто захватывает с веб-камеры по умолчанию и показывает его на QVideoWidget. В пользовательском интерфейсе у меня есть простое MainWindow с QGraphicsView внутри VerticalLayout:

дизайн интерфейса

Мой 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;
}

Когда я выполняю это, я запускаю приложение, но содержимое видео не масштабируется в соответствии с размером главного окна. Примеры:

Когда я запускаю приложение

Изменение размера главного окна вниз

Изменение размера главного окна вверх

Есть ли способ сделать так, чтобы размер видеоконтента хорошо менялся и соответствовал доступной площади? Я видел этот ответ: QVideoWidget: видео отключено, но оно не предлагает никакого решения, которое работает для меня. При использовании цепочки QGraphicsView-QGraphicsScene-QGraphicsVideoItem я вообще ничего не вижу.

1 ответ

Решение

При использовании следующей инструкции:

m_viewfinder = new QVideoWidget(ui->captureView);

Вы устанавливаете в качестве родителя m_viewfinder в captureViewИтак, позиции m_viewfinder будет относительно captureView, но это не означает, что он будет того же размера, что и родительский.

Один из самых простых способов сделать это - использовать макет. Кроме того, нет необходимости создавать QGraphicsWidget или QVBoxLayout, поэтому я рекомендую вам удалить его и получить дизайн, который был установлен по умолчанию:

введите описание изображения здесь

а затем мы устанавливаем макет, который находится в centralWidgetи в этом макете мы добавляем 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();
}
...

По следующей ссылке вы можете найти полный пример.

Другие вопросы по тегам