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
相关产品推荐
相关产品推荐

