1*4882a593Smuzhiyun/**************************************************************************** 2*4882a593Smuzhiyun** 3*4882a593Smuzhiyun** Copyright (C) 2017 The Qt Company Ltd. 4*4882a593Smuzhiyun** Contact: https://www.qt.io/licensing/ 5*4882a593Smuzhiyun** 6*4882a593Smuzhiyun** This file is part of the examples of the Qt Toolkit. 7*4882a593Smuzhiyun** 8*4882a593Smuzhiyun** $QT_BEGIN_LICENSE:BSD$ 9*4882a593Smuzhiyun** Commercial License Usage 10*4882a593Smuzhiyun** Licensees holding valid commercial Qt licenses may use this file in 11*4882a593Smuzhiyun** accordance with the commercial license agreement provided with the 12*4882a593Smuzhiyun** Software or, alternatively, in accordance with the terms contained in 13*4882a593Smuzhiyun** a written agreement between you and The Qt Company. For licensing terms 14*4882a593Smuzhiyun** and conditions see https://www.qt.io/terms-conditions. For further 15*4882a593Smuzhiyun** information use the contact form at https://www.qt.io/contact-us. 16*4882a593Smuzhiyun** 17*4882a593Smuzhiyun** BSD License Usage 18*4882a593Smuzhiyun** Alternatively, you may use this file under the terms of the BSD license 19*4882a593Smuzhiyun** as follows: 20*4882a593Smuzhiyun** 21*4882a593Smuzhiyun** "Redistribution and use in source and binary forms, with or without 22*4882a593Smuzhiyun** modification, are permitted provided that the following conditions are 23*4882a593Smuzhiyun** met: 24*4882a593Smuzhiyun** * Redistributions of source code must retain the above copyright 25*4882a593Smuzhiyun** notice, this list of conditions and the following disclaimer. 26*4882a593Smuzhiyun** * Redistributions in binary form must reproduce the above copyright 27*4882a593Smuzhiyun** notice, this list of conditions and the following disclaimer in 28*4882a593Smuzhiyun** the documentation and/or other materials provided with the 29*4882a593Smuzhiyun** distribution. 30*4882a593Smuzhiyun** * Neither the name of The Qt Company Ltd nor the names of its 31*4882a593Smuzhiyun** contributors may be used to endorse or promote products derived 32*4882a593Smuzhiyun** from this software without specific prior written permission. 33*4882a593Smuzhiyun** 34*4882a593Smuzhiyun** 35*4882a593Smuzhiyun** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 36*4882a593Smuzhiyun** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 37*4882a593Smuzhiyun** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 38*4882a593Smuzhiyun** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 39*4882a593Smuzhiyun** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 40*4882a593Smuzhiyun** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 41*4882a593Smuzhiyun** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 42*4882a593Smuzhiyun** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 43*4882a593Smuzhiyun** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 44*4882a593Smuzhiyun** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 45*4882a593Smuzhiyun** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." 46*4882a593Smuzhiyun** 47*4882a593Smuzhiyun** $QT_END_LICENSE$ 48*4882a593Smuzhiyun** 49*4882a593Smuzhiyun****************************************************************************/ 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun#include "qtcamera.h" 52*4882a593Smuzhiyun#include <QApplication> 53*4882a593Smuzhiyun#include <QMediaService> 54*4882a593Smuzhiyun#include <QMediaRecorder> 55*4882a593Smuzhiyun#include <QCameraViewfinder> 56*4882a593Smuzhiyun#include <QCameraInfo> 57*4882a593Smuzhiyun#include <QMediaMetaData> 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun#include <QMessageBox> 60*4882a593Smuzhiyun#include <QPalette> 61*4882a593Smuzhiyun#include <QTabWidget> 62*4882a593Smuzhiyun#include <QtWidgets> 63*4882a593Smuzhiyun#include <QHBoxLayout> 64*4882a593Smuzhiyun#include <QVBoxLayout> 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun#define QCAMERA_CAPTURE_MODE "Image Mode" 68*4882a593Smuzhiyun#define QCAMERA_VIDEO_MODE "Video Mode" 69*4882a593Smuzhiyun#define DIR_USERDATA "/userdata" 70*4882a593Smuzhiyun#define DIR_HOME QStandardPaths::writableLocation(QStandardPaths::HomeLocation) 71*4882a593SmuzhiyunQ_DECLARE_METATYPE(QCameraInfo) 72*4882a593Smuzhiyun 73*4882a593SmuzhiyunqtCamera::qtCamera() 74*4882a593Smuzhiyun{ 75*4882a593Smuzhiyun initlayout(); 76*4882a593Smuzhiyun QFileInfo fi(DIR_USERDATA); 77*4882a593Smuzhiyun if(fi.isDir()){ 78*4882a593Smuzhiyun locationDir = DIR_USERDATA; 79*4882a593Smuzhiyun }else { 80*4882a593Smuzhiyun QFileInfo fi(DIR_HOME); 81*4882a593Smuzhiyun if(fi.isDir()){ 82*4882a593Smuzhiyun locationDir = DIR_HOME; 83*4882a593Smuzhiyun } 84*4882a593Smuzhiyun } 85*4882a593Smuzhiyun imageCnt = videoCnt = 0; 86*4882a593Smuzhiyun setCamera(QCameraInfo::defaultCamera()); 87*4882a593Smuzhiyun} 88*4882a593Smuzhiyun 89*4882a593Smuzhiyunvoid qtCamera::initlayout() 90*4882a593Smuzhiyun{ 91*4882a593Smuzhiyun QBoxLayout *vLayout = new QVBoxLayout(); 92*4882a593Smuzhiyun const QRect availableGeometry = QApplication::desktop()->availableGeometry(this); 93*4882a593Smuzhiyun resize(availableGeometry.width(), availableGeometry.height()); 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun const QList<QCameraInfo> availableCameras = QCameraInfo::availableCameras(); 96*4882a593Smuzhiyun for (const QCameraInfo &cameraInfo : availableCameras) { 97*4882a593Smuzhiyun// qDebug() << cameraInfo.description(); 98*4882a593Smuzhiyun QPushButton *camera = getButton(); 99*4882a593Smuzhiyun camera->setText(cameraInfo.description()); 100*4882a593Smuzhiyun camera->setCheckable(true); 101*4882a593Smuzhiyun if (cameraInfo == QCameraInfo::defaultCamera()){ 102*4882a593Smuzhiyun camera->setDefault(true); 103*4882a593Smuzhiyun }else { 104*4882a593Smuzhiyun camera->setDefault(false); 105*4882a593Smuzhiyun } 106*4882a593Smuzhiyun connect(camera, SIGNAL(clicked(bool)), this, SLOT(on_cameraSwitch())); 107*4882a593Smuzhiyun vLayout->addWidget(camera); 108*4882a593Smuzhiyun } 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun modeButton = getButton(); 111*4882a593Smuzhiyun modeButton->setText(cameraMode); 112*4882a593Smuzhiyun connect(modeButton, SIGNAL(clicked(bool)), this, SLOT(updateCaptureMode())); 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun captureButton = getButton(); 115*4882a593Smuzhiyun captureButton->setText(tr("Capture")); 116*4882a593Smuzhiyun connect(captureButton, SIGNAL(clicked(bool)), this, SLOT(on_captureClicked())); 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun exitButton = getButton(); 119*4882a593Smuzhiyun exitButton->setText(tr("Exit")); 120*4882a593Smuzhiyun connect(exitButton, SIGNAL(clicked(bool)), this, SLOT(on_exitClicked())); 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun vLayout->addWidget(modeButton); 123*4882a593Smuzhiyun vLayout->addWidget(captureButton); 124*4882a593Smuzhiyun vLayout->addWidget(exitButton); 125*4882a593Smuzhiyun vLayout->setAlignment(Qt::AlignTop); 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun viewfinder.setWindowFlag(Qt::FramelessWindowHint); 128*4882a593Smuzhiyun viewfinder.setFixedSize(availableGeometry.width() - 150, availableGeometry.height()); 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun QBoxLayout *hlayout = new QHBoxLayout; 131*4882a593Smuzhiyun hlayout->setMargin(0); 132*4882a593Smuzhiyun hlayout->addWidget(&viewfinder); 133*4882a593Smuzhiyun hlayout->addLayout(vLayout); 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun QWidget *widget = new QWidget; 136*4882a593Smuzhiyun widget->setLayout(hlayout); 137*4882a593Smuzhiyun setCentralWidget(widget); 138*4882a593Smuzhiyun// setWindowState(Qt::WindowMaximized); 139*4882a593Smuzhiyun setWindowFlags(Qt::FramelessWindowHint); 140*4882a593Smuzhiyun} 141*4882a593Smuzhiyun 142*4882a593Smuzhiyunvoid qtCamera::setCamera(const QCameraInfo &cameraInfo) 143*4882a593Smuzhiyun{ 144*4882a593Smuzhiyun m_camera.reset(new QCamera(cameraInfo)); 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun connect(m_camera.data(), &QCamera::stateChanged, this, &qtCamera::updateCameraState); 147*4882a593Smuzhiyun connect(m_camera.data(), QOverload<QCamera::Error>::of(&QCamera::error), this, &qtCamera::displayCameraError); 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun m_mediaRecorder.reset(new QMediaRecorder(m_camera.data())); 150*4882a593Smuzhiyun connect(m_mediaRecorder.data(), &QMediaRecorder::stateChanged, this, &qtCamera::updateRecorderState); 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun m_imageCapture.reset(new QCameraImageCapture(m_camera.data())); 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun connect(m_mediaRecorder.data(), &QMediaRecorder::durationChanged, this, &qtCamera::updateRecordTime); 155*4882a593Smuzhiyun connect(m_mediaRecorder.data(), QOverload<QMediaRecorder::Error>::of(&QMediaRecorder::error), 156*4882a593Smuzhiyun this, &qtCamera::displayRecorderError); 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun m_mediaRecorder->setMetaData(QMediaMetaData::Title, QVariant(QLatin1String("Test Title"))); 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun configureCaptureSettings(); 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun m_camera->setViewfinder(&viewfinder); 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun updateCameraState(m_camera->state()); 165*4882a593Smuzhiyun updateRecorderState(m_mediaRecorder->state()); 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun connect(m_imageCapture.data(), &QCameraImageCapture::imageSaved, this, &qtCamera::imageSaved); 168*4882a593Smuzhiyun connect(m_imageCapture.data(), QOverload<int, QCameraImageCapture::Error, const QString &>::of(&QCameraImageCapture::error), 169*4882a593Smuzhiyun this, &qtCamera::displayCaptureError); 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun updateCaptureMode(); 172*4882a593Smuzhiyun} 173*4882a593Smuzhiyun 174*4882a593Smuzhiyunvoid qtCamera::configureCaptureSettings() 175*4882a593Smuzhiyun{ 176*4882a593Smuzhiyun QSize size(640, 480); 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun m_imageSettings.setCodec("jpeg"); 179*4882a593Smuzhiyun m_imageSettings.setQuality(QMultimedia::VeryHighQuality); 180*4882a593Smuzhiyun m_imageSettings.setResolution(size); 181*4882a593Smuzhiyun m_imageCapture->setEncodingSettings(m_imageSettings); 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun m_audioSettings.setCodec("audio/x-adpcm"); 184*4882a593Smuzhiyun m_audioSettings.setChannelCount(2); 185*4882a593Smuzhiyun m_audioSettings.setQuality(QMultimedia::NormalQuality); 186*4882a593Smuzhiyun m_mediaRecorder->setAudioSettings(m_audioSettings); 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun m_videoSettings.setCodec("video/x-h264"); 189*4882a593Smuzhiyun m_videoSettings.setResolution(size); 190*4882a593Smuzhiyun m_videoSettings.setQuality(QMultimedia::NormalQuality); 191*4882a593Smuzhiyun m_mediaRecorder->setVideoSettings(m_videoSettings); 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun m_mediaRecorder->setContainerFormat("video/quicktime"); 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun if (0) { 196*4882a593Smuzhiyun QList<QSize> supportedResolutions; 197*4882a593Smuzhiyun supportedResolutions = m_imageCapture->supportedResolutions(); 198*4882a593Smuzhiyun for (const QSize &resolution : supportedResolutions) { 199*4882a593Smuzhiyun qDebug() << "image resolution: " << resolution.width() << "x" << resolution.height(); 200*4882a593Smuzhiyun } 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun supportedResolutions = m_mediaRecorder->supportedResolutions(); 203*4882a593Smuzhiyun for (const QSize &resolution : supportedResolutions) { 204*4882a593Smuzhiyun qDebug() << "video resolution: " << resolution.width() << "x" << resolution.height(); 205*4882a593Smuzhiyun } 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun const QStringList supportedAudioCodecs = m_mediaRecorder->supportedAudioCodecs(); 208*4882a593Smuzhiyun for (const QString &codecName : supportedAudioCodecs) { 209*4882a593Smuzhiyun QString description = m_mediaRecorder->audioCodecDescription(codecName); 210*4882a593Smuzhiyun qDebug() << "audio codec:" << codecName + ": " + description; 211*4882a593Smuzhiyun } 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun const QStringList supportedVideoCodecs = m_mediaRecorder->supportedVideoCodecs(); 214*4882a593Smuzhiyun for (const QString &codecName : supportedVideoCodecs) { 215*4882a593Smuzhiyun QString description = m_mediaRecorder->videoCodecDescription(codecName); 216*4882a593Smuzhiyun qDebug() << "video codec:" << codecName + ": " + description; 217*4882a593Smuzhiyun } 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun const QStringList formats = m_mediaRecorder->supportedContainers(); 220*4882a593Smuzhiyun for (const QString &format : formats) { 221*4882a593Smuzhiyun<<<<<<< Updated upstream 222*4882a593Smuzhiyun QString description = m_mediaRecorder->containerDescription(format); 223*4882a593Smuzhiyun qDebug() << "container: " << format << ": " << description; 224*4882a593Smuzhiyun } 225*4882a593Smuzhiyun======= 226*4882a593Smuzhiyun qDebug() << format; 227*4882a593Smuzhiyun } 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun supportedResolutions = m_mediaRecorder->supportedResolutions(); 230*4882a593Smuzhiyun for (const QSize &resolution : supportedResolutions) { 231*4882a593Smuzhiyun if(size.width()<resolution.width() && size.height()<resolution.height()) 232*4882a593Smuzhiyun size = resolution; 233*4882a593Smuzhiyun } 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun m_audioSettings.setCodec("audio/mpeg"); 236*4882a593Smuzhiyun m_audioSettings.setQuality(QMultimedia::VeryHighQuality); 237*4882a593Smuzhiyun m_videoSettings.setCodec("video/x-h264"); 238*4882a593Smuzhiyun m_videoSettings.setQuality(QMultimedia::VeryHighQuality); 239*4882a593Smuzhiyun m_videoSettings.setResolution(size); 240*4882a593Smuzhiyun m_mediaRecorder->setAudioSettings(m_audioSettings); 241*4882a593Smuzhiyun m_mediaRecorder->setVideoSettings(m_videoSettings); 242*4882a593Smuzhiyun m_mediaRecorder->setContainerFormat("video/quicktime, variant=(string)iso"); 243*4882a593Smuzhiyun break; 244*4882a593Smuzhiyun } 245*4882a593Smuzhiyun default: 246*4882a593Smuzhiyun break; 247*4882a593Smuzhiyun>>>>>>> Stashed changes 248*4882a593Smuzhiyun } 249*4882a593Smuzhiyun} 250*4882a593Smuzhiyun 251*4882a593SmuzhiyunQPushButton* qtCamera::getButton() 252*4882a593Smuzhiyun{ 253*4882a593Smuzhiyun QPushButton *button = new QPushButton; 254*4882a593Smuzhiyun button->setFixedSize(144, 70); 255*4882a593Smuzhiyun return button; 256*4882a593Smuzhiyun} 257*4882a593Smuzhiyun 258*4882a593Smuzhiyunvoid qtCamera::updateRecordTime() 259*4882a593Smuzhiyun{ 260*4882a593Smuzhiyun QString str = QString("Recorded %1 sec").arg(m_mediaRecorder->duration()/1000); 261*4882a593Smuzhiyun statusBar()->showMessage(str); 262*4882a593Smuzhiyun} 263*4882a593Smuzhiyun 264*4882a593Smuzhiyunvoid qtCamera::record() 265*4882a593Smuzhiyun{ 266*4882a593Smuzhiyun QFileInfo fi; 267*4882a593Smuzhiyun QString lo; 268*4882a593Smuzhiyun 269*4882a593Smuzhiyun lo = locationDir + "/" + "VIDEO" + QString::number(videoCnt) + ".mov"; 270*4882a593Smuzhiyun fi = QFileInfo(lo); 271*4882a593Smuzhiyun 272*4882a593Smuzhiyun while(fi.isFile()){ 273*4882a593Smuzhiyun videoCnt++; 274*4882a593Smuzhiyun lo = locationDir + "/" + "VIDEO" + QString::number(videoCnt) + ".mov"; 275*4882a593Smuzhiyun fi = QFileInfo(lo); 276*4882a593Smuzhiyun } 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun m_mediaRecorder->setOutputLocation(QUrl::fromLocalFile(lo)); 279*4882a593Smuzhiyun m_mediaRecorder->record(); 280*4882a593Smuzhiyun updateRecordTime(); 281*4882a593Smuzhiyun} 282*4882a593Smuzhiyun 283*4882a593Smuzhiyunvoid qtCamera::stop() 284*4882a593Smuzhiyun{ 285*4882a593Smuzhiyun m_mediaRecorder->stop(); 286*4882a593Smuzhiyun} 287*4882a593Smuzhiyun 288*4882a593Smuzhiyunvoid qtCamera::takeImage() 289*4882a593Smuzhiyun{ 290*4882a593Smuzhiyun m_isCapturingImage = true; 291*4882a593Smuzhiyun QFileInfo fi; 292*4882a593Smuzhiyun QString lo; 293*4882a593Smuzhiyun 294*4882a593Smuzhiyun lo = locationDir + "/" + "PIC" + QString::number(imageCnt) + ".jpg"; 295*4882a593Smuzhiyun fi = QFileInfo(lo); 296*4882a593Smuzhiyun 297*4882a593Smuzhiyun while(fi.isFile()){ 298*4882a593Smuzhiyun imageCnt++; 299*4882a593Smuzhiyun lo = locationDir + "/" + "PIC" + QString::number(imageCnt) + ".jpg"; 300*4882a593Smuzhiyun fi = QFileInfo(lo); 301*4882a593Smuzhiyun } 302*4882a593Smuzhiyun 303*4882a593Smuzhiyun m_imageCapture->capture(lo); 304*4882a593Smuzhiyun} 305*4882a593Smuzhiyun 306*4882a593Smuzhiyunvoid qtCamera::displayCaptureError(int id, const QCameraImageCapture::Error error, const QString &errorString) 307*4882a593Smuzhiyun{ 308*4882a593Smuzhiyun Q_UNUSED(id); 309*4882a593Smuzhiyun Q_UNUSED(error); 310*4882a593Smuzhiyun QMessageBox::warning(this, tr("Image Capture Error"), errorString); 311*4882a593Smuzhiyun m_isCapturingImage = false; 312*4882a593Smuzhiyun} 313*4882a593Smuzhiyun 314*4882a593Smuzhiyunvoid qtCamera::updateCaptureMode() 315*4882a593Smuzhiyun{ 316*4882a593Smuzhiyun QCamera::CaptureModes captureMode; 317*4882a593Smuzhiyun QString capture; 318*4882a593Smuzhiyun if (cameraMode.compare(QCAMERA_CAPTURE_MODE)){ 319*4882a593Smuzhiyun captureMode = QCamera::CaptureStillImage ; 320*4882a593Smuzhiyun }else { 321*4882a593Smuzhiyun captureMode = QCamera::CaptureVideo; 322*4882a593Smuzhiyun } 323*4882a593Smuzhiyun 324*4882a593Smuzhiyun if (m_camera->isCaptureModeSupported(captureMode)){ 325*4882a593Smuzhiyun m_camera->unload(); 326*4882a593Smuzhiyun m_camera->setCaptureMode(captureMode); 327*4882a593Smuzhiyun m_camera->start(); 328*4882a593Smuzhiyun if(captureMode == QCamera::CaptureStillImage){ 329*4882a593Smuzhiyun cameraMode = QString(QCAMERA_CAPTURE_MODE); 330*4882a593Smuzhiyun capture = "Capture"; 331*4882a593Smuzhiyun }else { 332*4882a593Smuzhiyun cameraMode = QString(QCAMERA_VIDEO_MODE); 333*4882a593Smuzhiyun capture = "Record"; 334*4882a593Smuzhiyun } 335*4882a593Smuzhiyun modeButton->setText(cameraMode); 336*4882a593Smuzhiyun captureButton->setText(capture); 337*4882a593Smuzhiyun } 338*4882a593Smuzhiyun} 339*4882a593Smuzhiyun 340*4882a593Smuzhiyunvoid qtCamera::updateCameraState(QCamera::State state) 341*4882a593Smuzhiyun{ 342*4882a593Smuzhiyun switch (state) { 343*4882a593Smuzhiyun case QCamera::ActiveState: 344*4882a593Smuzhiyun break; 345*4882a593Smuzhiyun case QCamera::UnloadedState: 346*4882a593Smuzhiyun case QCamera::LoadedState: 347*4882a593Smuzhiyun break; 348*4882a593Smuzhiyun } 349*4882a593Smuzhiyun} 350*4882a593Smuzhiyun 351*4882a593Smuzhiyunvoid qtCamera::updateRecorderState(QMediaRecorder::State state) 352*4882a593Smuzhiyun{ 353*4882a593Smuzhiyun switch (state) { 354*4882a593Smuzhiyun case QMediaRecorder::StoppedState: 355*4882a593Smuzhiyun captureButton->setText(tr("Record")); 356*4882a593Smuzhiyun break; 357*4882a593Smuzhiyun case QMediaRecorder::PausedState: 358*4882a593Smuzhiyun break; 359*4882a593Smuzhiyun case QMediaRecorder::RecordingState: 360*4882a593Smuzhiyun captureButton->setText(tr("Recording")); 361*4882a593Smuzhiyun break; 362*4882a593Smuzhiyun } 363*4882a593Smuzhiyun} 364*4882a593Smuzhiyun 365*4882a593Smuzhiyunvoid qtCamera::displayRecorderError() 366*4882a593Smuzhiyun{ 367*4882a593Smuzhiyun QMessageBox::warning(this, tr("Capture Error"), m_mediaRecorder->errorString()); 368*4882a593Smuzhiyun} 369*4882a593Smuzhiyun 370*4882a593Smuzhiyunvoid qtCamera::displayCameraError() 371*4882a593Smuzhiyun{ 372*4882a593Smuzhiyun QMessageBox::warning(this, tr("Camera Error"), m_camera->errorString()); 373*4882a593Smuzhiyun} 374*4882a593Smuzhiyun 375*4882a593Smuzhiyunvoid qtCamera::imageSaved(int id, const QString &fileName) 376*4882a593Smuzhiyun{ 377*4882a593Smuzhiyun Q_UNUSED(id); 378*4882a593Smuzhiyun statusBar()->showMessage(tr("Captured \"%1\"").arg(QDir::toNativeSeparators(fileName))); 379*4882a593Smuzhiyun statusBar()->show(); 380*4882a593Smuzhiyun m_isCapturingImage = false; 381*4882a593Smuzhiyun if (m_applicationExiting) 382*4882a593Smuzhiyun close(); 383*4882a593Smuzhiyun} 384*4882a593Smuzhiyun 385*4882a593Smuzhiyunvoid qtCamera::closeEvent(QCloseEvent *event) 386*4882a593Smuzhiyun{ 387*4882a593Smuzhiyun if (m_isCapturingImage) { 388*4882a593Smuzhiyun setEnabled(false); 389*4882a593Smuzhiyun m_applicationExiting = true; 390*4882a593Smuzhiyun event->ignore(); 391*4882a593Smuzhiyun } else { 392*4882a593Smuzhiyun event->accept(); 393*4882a593Smuzhiyun } 394*4882a593Smuzhiyun} 395*4882a593Smuzhiyun 396*4882a593Smuzhiyunvoid qtCamera::on_cameraSwitch() 397*4882a593Smuzhiyun{ 398*4882a593Smuzhiyun QList<QPushButton *> buttons = centralWidget()->findChildren<QPushButton *>(); 399*4882a593Smuzhiyun for(auto *but: buttons){ 400*4882a593Smuzhiyun if(but->isChecked()){ 401*4882a593Smuzhiyun for(auto *button: buttons){ 402*4882a593Smuzhiyun if(button->isDefault()) 403*4882a593Smuzhiyun button->setDefault(false); 404*4882a593Smuzhiyun } 405*4882a593Smuzhiyun but->setDefault(true); 406*4882a593Smuzhiyun but->setChecked(false); 407*4882a593Smuzhiyun qDebug() << "switch to " + but->text(); 408*4882a593Smuzhiyun const QList<QCameraInfo> availableCameras = QCameraInfo::availableCameras(); 409*4882a593Smuzhiyun for (const QCameraInfo &cameraInfo : availableCameras) { 410*4882a593Smuzhiyun if(! but->text().compare(cameraInfo.description())){ 411*4882a593Smuzhiyun qDebug() << cameraInfo.description(); 412*4882a593Smuzhiyun setCamera(cameraInfo); 413*4882a593Smuzhiyun } 414*4882a593Smuzhiyun } 415*4882a593Smuzhiyun break; 416*4882a593Smuzhiyun } 417*4882a593Smuzhiyun } 418*4882a593Smuzhiyun} 419*4882a593Smuzhiyun 420*4882a593Smuzhiyunvoid qtCamera::on_captureClicked() 421*4882a593Smuzhiyun{ 422*4882a593Smuzhiyun if (m_camera->captureMode() == QCamera::CaptureStillImage) { 423*4882a593Smuzhiyun takeImage(); 424*4882a593Smuzhiyun } else { 425*4882a593Smuzhiyun if (m_mediaRecorder->state() == QMediaRecorder::RecordingState) 426*4882a593Smuzhiyun stop(); 427*4882a593Smuzhiyun else 428*4882a593Smuzhiyun record(); 429*4882a593Smuzhiyun } 430*4882a593Smuzhiyun} 431*4882a593Smuzhiyun 432*4882a593Smuzhiyunvoid qtCamera::on_exitClicked() 433*4882a593Smuzhiyun{ 434*4882a593Smuzhiyun qApp->exit(0); 435*4882a593Smuzhiyun} 436