From 133bf26f8d75ea6708e429bcd611d37ed353f613 Mon Sep 17 00:00:00 2001 From: Artem Dyomin Date: Fri, 11 Nov 2022 10:02:02 +0100 Subject: Fix issues in camera example - fix memory leak - QImageCapture - fix multimple signals connection Change-Id: I63df2bd16f678c67a3ee90c7e7251575d9cdeb1e Reviewed-by: Piotr Srebrny Reviewed-by: Lars Knoll (cherry picked from commit ac0e44288d305fb22d9396f97f7ee0b1d371e917) --- examples/multimedia/camera/camera.cpp | 40 ++++++++++++++++++----------------- examples/multimedia/camera/camera.h | 3 +-- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/examples/multimedia/camera/camera.cpp b/examples/multimedia/camera/camera.cpp index 201e6e985..95b6efda8 100644 --- a/examples/multimedia/camera/camera.cpp +++ b/examples/multimedia/camera/camera.cpp @@ -46,6 +46,8 @@ Camera::Camera() connect(ui->captureWidget, &QTabWidget::currentChanged, this, &Camera::updateCaptureMode); connect(ui->metaDataButton, &QPushButton::clicked, this, &Camera::showMetaDataDialog); + connect(ui->exposureCompensation, &QAbstractSlider::valueChanged, this, + &Camera::setExposureCompensation); setCamera(QMediaDevices::defaultVideoInput()); } @@ -61,26 +63,31 @@ void Camera::setCamera(const QCameraDevice &cameraDevice) if (!m_mediaRecorder) { m_mediaRecorder.reset(new QMediaRecorder); m_captureSession.setRecorder(m_mediaRecorder.data()); - connect(m_mediaRecorder.data(), &QMediaRecorder::recorderStateChanged, this, &Camera::updateRecorderState); - } - - m_imageCapture = new QImageCapture; - m_captureSession.setImageCapture(m_imageCapture); - connect(m_mediaRecorder.data(), &QMediaRecorder::durationChanged, this, &Camera::updateRecordTime); - connect(m_mediaRecorder.data(), &QMediaRecorder::errorChanged, this, &Camera::displayRecorderError); + connect(m_mediaRecorder.data(), &QMediaRecorder::recorderStateChanged, this, + &Camera::updateRecorderState); + connect(m_mediaRecorder.data(), &QMediaRecorder::durationChanged, this, + &Camera::updateRecordTime); + connect(m_mediaRecorder.data(), &QMediaRecorder::errorChanged, this, + &Camera::displayRecorderError); + } - connect(ui->exposureCompensation, &QAbstractSlider::valueChanged, this, &Camera::setExposureCompensation); + if (!m_imageCapture) { + m_imageCapture.reset(new QImageCapture); + m_captureSession.setImageCapture(m_imageCapture.get()); + connect(m_imageCapture.get(), &QImageCapture::readyForCaptureChanged, this, + &Camera::readyForCapture); + connect(m_imageCapture.get(), &QImageCapture::imageCaptured, this, + &Camera::processCapturedImage); + connect(m_imageCapture.get(), &QImageCapture::imageSaved, this, &Camera::imageSaved); + connect(m_imageCapture.get(), &QImageCapture::errorOccurred, this, + &Camera::displayCaptureError); + } m_captureSession.setVideoOutput(ui->viewfinder); updateCameraActive(m_camera->isActive()); updateRecorderState(m_mediaRecorder->recorderState()); - - connect(m_imageCapture, &QImageCapture::readyForCaptureChanged, this, &Camera::readyForCapture); - connect(m_imageCapture, &QImageCapture::imageCaptured, this, &Camera::processCapturedImage); - connect(m_imageCapture, &QImageCapture::imageSaved, this, &Camera::imageSaved); - connect(m_imageCapture, &QImageCapture::errorOccurred, this, &Camera::displayCaptureError); readyForCapture(m_imageCapture->isReadyForCapture()); updateCaptureMode(); @@ -134,11 +141,6 @@ void Camera::keyPressEvent(QKeyEvent * event) } } -void Camera::keyReleaseEvent(QKeyEvent *event) -{ - QMainWindow::keyReleaseEvent(event); -} - void Camera::updateRecordTime() { QString str = QString("Recorded %1 sec").arg(m_mediaRecorder->duration()/1000); @@ -178,7 +180,7 @@ void Camera::configureVideoSettings() void Camera::configureImageSettings() { - ImageSettings settingsDialog(m_imageCapture); + ImageSettings settingsDialog(m_imageCapture.get()); settingsDialog.setWindowFlags(settingsDialog.windowFlags() & ~Qt::WindowContextHelpButtonHint); if (settingsDialog.exec()) { diff --git a/examples/multimedia/camera/camera.h b/examples/multimedia/camera/camera.h index ae8eb5919..290388a31 100644 --- a/examples/multimedia/camera/camera.h +++ b/examples/multimedia/camera/camera.h @@ -76,7 +76,6 @@ private slots: protected: void keyPressEvent(QKeyEvent *event) override; - void keyReleaseEvent(QKeyEvent *event) override; void closeEvent(QCloseEvent *event) override; private: @@ -85,10 +84,10 @@ private: QActionGroup *videoDevicesGroup = nullptr; QMediaDevices m_devices; + QScopedPointer m_imageCapture; QMediaCaptureSession m_captureSession; QScopedPointer m_camera; QScopedPointer m_audioInput; - QImageCapture *m_imageCapture; QScopedPointer m_mediaRecorder; bool m_isCapturingImage = false; -- cgit v1.2.1