diff options
author | Lars Knoll <lars.knoll@qt.io> | 2021-01-22 15:39:50 +0100 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2021-01-29 08:51:57 +0000 |
commit | b6b93bccc0202341c64102a6cc19a83b1e32d0a2 (patch) | |
tree | c84ba79ea6d4a16a82175dedc66e43672d5257e8 /examples | |
parent | a32a5a2fc32441c402ddb67d893442c96c8fee0c (diff) |
Implement notifications when the available cameras change for macOS
Listen to AVCaptureDeviceWas(Dis)ConnectedNotification notifications
and refresh our video device list if we get one of them.
Change-Id: Idf79e88e06422d74ab61cb82676c4b82fd1fb387
Reviewed-by: Doris Verria <doris.verria@qt.io>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'examples')
-rw-r--r-- | examples/multimediawidgets/camera/camera.cpp | 29 | ||||
-rw-r--r-- | examples/multimediawidgets/camera/camera.h | 5 |
2 files changed, 23 insertions, 11 deletions
diff --git a/examples/multimediawidgets/camera/camera.cpp b/examples/multimediawidgets/camera/camera.cpp index 196b8ba84..385608bbc 100644 --- a/examples/multimediawidgets/camera/camera.cpp +++ b/examples/multimediawidgets/camera/camera.cpp @@ -73,18 +73,10 @@ Camera::Camera() : ui(new Ui::Camera) //Camera devices: - QActionGroup *videoDevicesGroup = new QActionGroup(this); + videoDevicesGroup = new QActionGroup(this); videoDevicesGroup->setExclusive(true); - const QList<QCameraInfo> availableCameras = QMediaDeviceManager::videoInputs(); - for (const QCameraInfo &cameraInfo : availableCameras) { - QAction *videoDeviceAction = new QAction(cameraInfo.description(), videoDevicesGroup); - videoDeviceAction->setCheckable(true); - videoDeviceAction->setData(QVariant::fromValue(cameraInfo)); - if (cameraInfo == QMediaDeviceManager::defaultVideoInput()) - videoDeviceAction->setChecked(true); - - ui->menuDevices->addAction(videoDeviceAction); - } + updateCameras(); + connect(QMediaDeviceManager::instance(), &QMediaDeviceManager::videoInputsChanged, this, &Camera::updateCameras); connect(videoDevicesGroup, &QActionGroup::triggered, this, &Camera::updateCameraDevice); connect(ui->captureWidget, &QTabWidget::currentChanged, this, &Camera::updateCaptureMode); @@ -433,3 +425,18 @@ void Camera::closeEvent(QCloseEvent *event) event->accept(); } } + +void Camera::updateCameras() +{ + ui->menuDevices->clear(); + const QList<QCameraInfo> availableCameras = QMediaDeviceManager::videoInputs(); + for (const QCameraInfo &cameraInfo : availableCameras) { + QAction *videoDeviceAction = new QAction(cameraInfo.description(), videoDevicesGroup); + videoDeviceAction->setCheckable(true); + videoDeviceAction->setData(QVariant::fromValue(cameraInfo)); + if (cameraInfo == QMediaDeviceManager::defaultVideoInput()) + videoDeviceAction->setChecked(true); + + ui->menuDevices->addAction(videoDeviceAction); + } +} diff --git a/examples/multimediawidgets/camera/camera.h b/examples/multimediawidgets/camera/camera.h index bdef8b8f8..d45923cc4 100644 --- a/examples/multimediawidgets/camera/camera.h +++ b/examples/multimediawidgets/camera/camera.h @@ -60,6 +60,7 @@ QT_BEGIN_NAMESPACE namespace Ui { class Camera; } +class QActionGroup; QT_END_NAMESPACE class Camera : public QMainWindow @@ -109,6 +110,8 @@ private slots: void readyForCapture(bool ready); void imageSaved(int id, const QString &fileName); + void updateCameras(); + protected: void keyPressEvent(QKeyEvent *event) override; void keyReleaseEvent(QKeyEvent *event) override; @@ -117,6 +120,8 @@ protected: private: Ui::Camera *ui; + QActionGroup *videoDevicesGroup = nullptr; + QScopedPointer<QCamera> m_camera; QCameraImageCapture *m_imageCapture; QScopedPointer<QMediaRecorder> m_mediaRecorder; |