You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QVideoWidget无法正常调整大小的Qt摄像头应用问题排查

实现Qt摄像头画面捕获并在QVideoWidget中显示

我最近开发了一款Qt应用,用来捕获默认摄像头的画面并在QVideoWidget中展示,下面是完整的实现思路、布局说明和核心代码:

UI布局设计

主窗口MainWindow内部使用垂直布局(VerticalLayout),布局中放置了一个QGraphicsView控件(命名为captureView),后续我们会把显示摄像头画面的QVideoWidget作为它的子控件嵌入进去。

核心代码实现

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QCamera>
#include <QCameraInfo>
#include <QVideoWidget>

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
    ui->setupUi(this);
    
    // 创建QVideoWidget作为captureView的子控件
    m_viewfinder = new QVideoWidget(ui->captureView);
    // 绑定到父控件的大小,确保画面充满容器
    m_viewfinder->setGeometry(ui->captureView->rect());
    
    // 初始化摄像头,选用系统默认摄像头设备
    m_camera = new QCamera(QCameraInfo::defaultCamera());
    // 设置摄像头的取景器为我们创建的QVideoWidget
    m_camera->setViewfinder(m_viewfinder);
    
    // 启动摄像头捕获画面
    m_camera->start();
}

MainWindow::~MainWindow() {
    // 销毁前停止摄像头,避免资源泄漏
    if (m_camera->isActive()) {
        m_camera->stop();
    }
    delete m_camera;
    delete m_viewfinder;
    delete ui;
}

// 重写resizeEvent,确保窗口大小变化时画面自适应
void MainWindow::resizeEvent(QResizeEvent *event) {
    QMainWindow::resizeEvent(event);
    if (m_viewfinder) {
        m_viewfinder->setGeometry(ui->captureView->rect());
    }
}

项目配置(.pro文件)

别忘了在项目配置中添加多媒体相关模块,否则编译会报错:

QT += core gui multimedia multimediawidgets

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = CameraCaptureDemo
TEMPLATE = app

SOURCES += main.cpp \
           mainwindow.cpp

HEADERS += mainwindow.h

FORMS += mainwindow.ui

关键注意点

  • 必须引入<QCamera>、<QCameraInfo>和<QVideoWidget>头文件,否则无法使用摄像头相关API。
  • 窗口大小变化时要重写resizeEvent来调整QVideoWidget的尺寸,避免画面拉伸错位。
  • 如果需要支持多摄像头切换,可以通过QCameraInfo::availableCameras()枚举所有可用设备,再动态切换QCamera的设备。

内容的提问来源于stack exchange,提问作者mahesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:41:57