summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-01-22 15:39:50 +0100
committerLars Knoll <lars.knoll@qt.io>2021-01-29 08:51:57 +0000
commitb6b93bccc0202341c64102a6cc19a83b1e32d0a2 (patch)
treec84ba79ea6d4a16a82175dedc66e43672d5257e8 /examples
parenta32a5a2fc32441c402ddb67d893442c96c8fee0c (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.cpp29
-rw-r--r--examples/multimediawidgets/camera/camera.h5
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;