当前位置: 首页 > java >正文

Qt实战:如何打开摄像头并实现视频的实时预览

文章目录

    • 一、在 pro 文件中添加模块
    • 二、代码实现

一、在 pro 文件中添加模块

在 Qt5 中,如果你要使用 QCamera、QCameraViewfinder、QCameraImageCapture 等类,需要在 pro 文件里添加 multimedia 模块。

QT  += multimedia multimediawidgets
  • multimedia:核心多媒体功能(QCamera、QCameraImageCapture)
  • multimediawidgets:视频显示控件(QCameraViewfinder、QVideoWidget)

检查包含头文件:

#include <QCamera>
#include <QCameraViewfinder>
#include <QCameraImageCapture>

二、代码实现

在 Qt5 里,使用的是 QCamera + QCameraViewfinder + QCameraImageCapture。

CameraWindow.h

#pragma once#include <QWidget>
#include <QCamera>
#include <QCameraViewfinder>
#include <QCameraImageCapture>
#include <QPushButton>
#include <QVBoxLayout>
#include <QLabel>class CameraWindow : public QWidget
{Q_OBJECT
public:explicit CameraWindow(QWidget *parent = nullptr);private slots:void onOpenCamera();void onCaptureImage();void onCloseCamera();void onImageCaptured(int id, const QImage &preview);private:QCamera *m_camera = nullptr;QCameraViewfinder *m_viewfinder = nullptr;QCameraImageCapture *m_imageCapture = nullptr;QPushButton *m_btnOpen;QPushButton *m_btnCapture;QPushButton *m_btnClose;QLabel *m_labelPhoto;
};

CameraWindow.cpp

#include "CameraWindow.h"
#include <QDebug>
#include <QDateTime>CameraWindow::CameraWindow(QWidget *parent) : QWidget(parent)
{setWindowTitle("Qt5 摄像头示例");resize(800, 600);// 预览控件m_viewfinder = new QCameraViewfinder(this);m_viewfinder->setMinimumSize(640, 480);// 按钮m_btnOpen = new QPushButton("打开摄像头");m_btnCapture = new QPushButton("拍照");m_btnClose = new QPushButton("关闭摄像头");// 拍照结果显示m_labelPhoto = new QLabel;m_labelPhoto->setFixedSize(200, 150);m_labelPhoto->setStyleSheet("border: 1px solid gray;");// 布局auto vLayout = new QVBoxLayout(this);vLayout->addWidget(m_viewfinder, 1);auto hLayout = new QHBoxLayout;hLayout->addWidget(m_btnOpen);hLayout->addWidget(m_btnCapture);hLayout->addWidget(m_btnClose);hLayout->addWidget(m_labelPhoto);vLayout->addLayout(hLayout);// 信号槽connect(m_btnOpen, &QPushButton::clicked, this, &CameraWindow::onOpenCamera);connect(m_btnCapture, &QPushButton::clicked, this, &CameraWindow::onCaptureImage);connect(m_btnClose, &QPushButton::clicked, this, &CameraWindow::onCloseCamera);
}void CameraWindow::onOpenCamera()
{if (m_camera) return; // 已经打开m_camera = new QCamera(this);m_camera->setViewfinder(m_viewfinder);m_imageCapture = new QCameraImageCapture(m_camera, this);connect(m_imageCapture, &QCameraImageCapture::imageCaptured,this, &CameraWindow::onImageCaptured);m_camera->start();qDebug() << "摄像头已打开";
}void CameraWindow::onCaptureImage()
{if (!m_imageCapture) return;QString filename = QString("photo_%1.jpg").arg(QDateTime::currentDateTime().toString("yyyyMMdd_hhmmss"));m_imageCapture->capture(filename);qDebug() << "已拍照保存到:" << filename;
}void CameraWindow::onCloseCamera()
{if (m_camera) {m_camera->stop();delete m_camera;m_camera = nullptr;delete m_imageCapture;m_imageCapture = nullptr;qDebug() << "摄像头已关闭";}
}void CameraWindow::onImageCaptured(int, const QImage &preview)
{m_labelPhoto->setPixmap(QPixmap::fromImage(preview).scaled(m_labelPhoto->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));
}

main.cpp

#include "CameraWindow.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);CameraWindow w;w.show();return a.exec();
}
http://www.xdnf.cn/news/19255.html

相关文章:

  • 2025年09月计算机二级Java选择题每日一练——第十二期
  • macOs上ffmpeg带入libx264库交叉编译
  • 【龙泽科技】汽车电气故障诊断仿真教学软件【迈腾380TSI】
  • WebGIS视角:体感温度实证,哪座“火炉”火力全开?
  • centos7中MySQL 5.7.32 到 5.7.44 升级指南:基于官方二进制包的原地替换式升级
  • xAI发布全新编码模型 grok‑code‑fast‑1!
  • Kafka 消费模型
  • Qt 窗口 - 3
  • 操作系统-虚拟内存篇
  • 机器学习中的欠拟合与过拟合
  • 2025年如何批量下载雪球帖子和文章导出pdf?
  • 每日Java并发面试系列(5):基础篇(线程池的核心原理是什么、线程池大小设置为多少更合适、线程池哪几种类型?ThreadLocal为什么会导致内存泄漏?)
  • web渗透PHP反序列化漏洞
  • 设计模式 - 静态工厂模式 + 策略模式,
  • 【一】Django框架版本介绍
  • k8s 定时任务需求模板
  • 手动安装的node到nvm吧版本管理的过程。
  • GaussDB生产扩容引起的PANIC问题处理案例
  • HarmonyOS元服务开发
  • HarmonyOS三方库的使用
  • 计算机毕业设计 java 在线学习系统 基于 Java 的在线教育平台 Java 开发的学习管理系统
  • MongoDB 源码编译与调试:深入理解存储引擎设计 内容详细
  • 【办公类-39-06】20250830通义万相水果图(万相2.1专业Q版线描风格+万相专业2.2默认简笔画效果)
  • 淘宝利用商品关键词获取商品信息指南
  • GRPO(组相对策略优化):大模型强化学习的高效进化
  • 最强分布式锁工具:Redisson
  • Ztero文献管理工具插件设置——亲测有效
  • 【YOLO11小目标改进】多尺度前馈网络(MSFN)代码
  • Java全栈工程师的实战面试:从基础到微服务
  • 当“循环经济”遇上“小程序”,旧物回收正迎来“智慧”升级