Qt处理Windows平板上摄像头

方案一:使用QCamera

项目配置(pro文件)

qmake

QT += multimedia multimediawidgets
# 如果需要使用QML
QT += qml quick
# Windows平台可能需要
win32: LIBS += -lole32

1. 完整摄像头控制类

cpp

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

class AdvancedCameraWindow : public QWidget
{
    Q_OBJECT

public:
    AdvancedCameraWindow(QWidget *parent = nullptr) : QWidget(parent)
    {
        setupUI();
        refreshCameraList();
        setupConnections();
    }

private slots:
    void refreshCameraList()
    {
        m_cameraCombo->clear();
        QList cameras = QCameraInfo::availableCameras();
        
        for (const QCameraInfo &cameraInfo : cameras) {
            QString cameraName = cameraInfo.description();
            // 判断摄像头类型
            if (cameraInfo.position() == QCamera::FrontFace) {
                cameraName += " (前置)";
            } else if (cameraInfo.position() == QCamera::BackFace) {
                cameraName += " (后置)";
            }
            m_cameraCombo->addItem(cameraName, QVariant::fromValue(cameraInfo));
        }
    }

    void switchCamera(int index)
    {
        if (m_camera && m_camera->status() == QCamera::ActiveStatus) {
            m_camera->stop();
        }

        if (index >= 0) {
            QCameraInfo cameraInfo = m_cameraCombo->itemData(index).value();
            m_camera = new QCamera(cameraInfo, this);
            setupCamera();
            m_camera->start();
            
            updateCameraCapabilities();
        }
    }

    void toggleTorch(bool enabled)
    {
        if (!m_camera || !m_flashControl) return;
        
        if (enabled) {
            m_flashControl->setFlashMode(QCameraExposure::FlashTorch);
        } else {
            m_flashControl->setFlashMode(QCameraExposure::FlashOff);
        }
    }

    void toggleCamera(bool start)
    {
        if (start) {
            if (m_camera) {
                m_camera->start();
            }
        } else {
            if (m_camera) {
                m_camera->stop();
            }
        }
    }

    void setZoom(int value)
    {
        if (m_focus) {
            m_focus->zoomTo(value, value);
        }
    }

    void setExposureCompensation(int value)
    {
        if (m_exposure) {
            m_exposure->setExposureCompensation(value / 10.0);
        }
    }

    void captureImage()
    {
        if (m_imageCapture && m_imageCapture->isReadyForCapture()) {
            QString filename = QString("capture_%1.jpg").arg(QDateTime::currentDateTime().toString("yyyyMMdd_hhmmss"));
            m_imageCapture->capture(filename);
        }
    }

    void imageCaptured(int id, const QImage &preview)
    {
        Q_UNUSED(id)
        preview.save("latest_capture.jpg");
    }

private:
    void setupUI()
    {
        QVBoxLayout *mainLayout = new QVBoxLayout(this);

        // 摄像头选择区域
        QGroupBox *cameraGroup = new QGroupBox("摄像头设置", this);
        QHBoxLayout *cameraLayout = new QHBoxLayout(cameraGroup);
        
        cameraLayout->addWidget(new QLabel("选择摄像头:"));
        m_cameraCombo = new QComboBox(this);
        cameraLayout->addWidget(m_cameraCombo);
        
        QPushButton *refreshBtn = new QPushButton("刷新列表", this);
        cameraLayout->addWidget(refreshBtn);
        
        mainLayout->addWidget(cameraGroup);

        // 视频显示区域
        m_viewfinder = new QCameraViewfinder(this);
        m_viewfinder->setMinimumSize(640, 480);
        mainLayout->addWidget(m_viewfinder);

        // 控制按钮区域
        QGroupBox *controlGroup = new QGroupBox("摄像头控制", this);
        QGridLayout *controlLayout = new QGridLayout(controlGroup);
        
        // 闪光灯控制
        m_torchCheck = new QCheckBox("开启闪光灯/手电筒", this);
        controlLayout->addWidget(m_torchCheck, 0, 0, 1, 2);
        
        // 变焦控制
        controlLayout->addWidget(new QLabel("变焦:"), 1, 0);
        m_zoomSlider = new QSlider(Qt::Horizontal, this);
        m_zoomSlider->setRange(1, 10);
        m_zoomSlider->setValue(1);
        controlLayout->addWidget(m_zoomSlider, 1, 1);
        
        // 曝光补偿
        controlLayout->addWidget(new QLabel("曝光补偿:"), 2, 0);
        m_exposureSlider = new QSlider(Qt::Horizontal, this);
        m_exposureSlider->setRange(-20, 20);
        m_exposureSlider->setValue(0);
        controlLayout->addWidget(m_exposureSlider, 2, 1);
        
        mainLayout->addWidget(controlGroup);

        // 操作按钮
        QHBoxLayout *buttonLayout = new QHBoxLayout();
        
        m_startBtn = new QPushButton("开始", this);
        m_stopBtn = new QPushButton("停止", this);
        m_captureBtn = new QPushButton("拍照", this);
        
        buttonLayout->addWidget(m_startBtn);
        buttonLayout->addWidget(m_stopBtn);
        buttonLayout->addWidget(m_captureBtn);
        
        mainLayout->addLayout(buttonLayout);
    }

    void setupConnections()
    {
        connect(m_cameraCombo, QOverload::of(&QComboBox::currentIndexChanged),
                this, &AdvancedCameraWindow::switchCamera);
        connect(m_torchCheck, &QCheckBox::toggled,
                this, &AdvancedCameraWindow::toggleTorch);
        connect(m_startBtn, &QPushButton::clicked,
                this, [this]() { toggleCamera(true); });
        connect(m_stopBtn, &QPushButton::clicked,
                this, [this]() { toggleCamera(false); });
        connect(m_captureBtn, &QPushButton::clicked,
                this, &AdvancedCameraWindow::captureImage);
        connect(m_zoomSlider, &QSlider::valueChanged,
                this, &AdvancedCameraWindow::setZoom);
        connect(m_exposureSlider, &QSlider::valueChanged,
                this, &AdvancedCameraWindow::setExposureCompensation);
    }

    void setupCamera()
    {
        if (!m_camera) return;

        m_camera->setViewfinder(m_viewfinder);
        
        // 设置图像捕获
        m_imageCapture = new QCameraImageCapture(m_camera, this);
        m_camera->setCaptureMode(QCamera::CaptureStillImage);
        
        connect(m_imageCapture, &QCameraImageCapture::imageCaptured,
                this, &AdvancedCameraWindow::imageCaptured);

        // 获取控制接口
        m_focus = m_camera->focus();
        m_exposure = m_camera->exposure();
        m_flashControl = m_camera->exposure(); // Flash control is part of exposure
    }

    void updateCameraCapabilities()
    {
        // 更新UI以反映当前摄像头的功能
        if (m_exposure) {
            bool hasTorch = m_exposure->isFlashModeSupported(QCameraExposure::FlashTorch);
            m_torchCheck->setEnabled(hasTorch);
            m_torchCheck->setChecked(false);
        }
        
        if (m_focus) {
            bool canZoom = m_focus->isAvailable() && m_focus->isZoomModeSuppo
posted on 2025-10-04 17:25  ljbguanli  阅读(5)  评论(0)    收藏  举报