c++ - 从 QThread 使用 QCamera/QCameraInfo

标签 c++ qt camera qthread qcamera

我有一个 Camera 类,目前只返回连接到计算机的可用相机数量。在我的 PhotoProcessor 类 (QWidget) 中创建了一个 Camera 对象,然后将其移至另一个线程,因为我在检查可用相机时注意到一些轻微的挂起:

在 photoprocessor.cpp 中

void PhotoProcessor::GetAvailableCameras()
{
    //Create new camera to go and fetch number of cameras.
    Camera *camera_connection = new Camera;

    //Create thread and send away.
    QThread *thread = new QThread;
    camera_connection->moveToThread(thread);
    connect(camera_connection, SIGNAL(CameraCountSignal(int)), this, SLOT(CameraCountSlot(int)));
    connect(thread, SIGNAL(started()), camera_connection, SLOT(GetAvailableCameras()));
    connect(camera_connection, SIGNAL(CloseCameraThreadSignal()), thread, SLOT(quit()));
    connect(camera_connection, SIGNAL(CloseCameraThreadSignal()), camera_connection, SLOT(deleteLater()));
    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
    thread->start();

    return;
}

相机.h

#ifndef CAMERA_H
#define CAMERA_H

#include <QObject>
#include <QCamera>
#include <QCameraInfo>

class Camera : public QObject
{
    Q_OBJECT

public:
    Camera();

public slots:
    void GetAvailableCameras();

signals:
    void CameraCountSignal(int);
    void CloseCameraThreadSignal();
};

#endif // CAMERA_H

相机.cpp

#include "camera.h"

Camera::Camera()
{

}

void Camera::GetAvailableCameras()
{  
    QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
    emit CameraCountSignal(cameras.size());
    emit CloseCameraThreadSignal();
    return;
}

当从 photoprocessor.cpp 运行 QCameraInfo::availableCameras() 时,它说有一个连接的相机是正确的,但是无论我做什么,线程相机对象永远无法检测到相机,即相机的大小为零.

这里发生了什么?

最佳答案

时隔一年,我决定重新审视这个问题。

我认为在我的实际代码中我创建了一个 QCamera 对象,当线程被删除时,我删除不正确,并且在线程完成后,我无法再使用 QCameraInfo::availableCameras() 找到任何相机。

设置新 QCamera 对象的父对象为我明确解决了这个问题,即

QCamera *camera = new QCamera(QCameraInfo);
camera->setParent(this);

关于c++ - 从 QThread 使用 QCamera/QCameraInfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49379214/

相关文章:

c++ - 如何通过套接字将文本文件的内容从服务器发送到客户端?

c++ - 使用 Qt Creator 表单进行适当的子类化?

c++ - 动态创建一个函数指针来调用给定实例上的方法

c++ - 使用N-API时如何避免段错误?

c++ - 为什么 Windows 10 会在我的程序中启动额外的线程?

c++ - 如何捕获 QTreeView 取消选择事件?

c++ - 如何在C++(QT框架)中构建一个带有UTF字符的字符串

c++ - 在 C++ 中使用 OpenCV 从摄像机流式传输视频时程序不会启动

java - 捕获后在 ImageView 中显示图像(android java)

Android 相机只对焦一次