diff options
author | Michael Goddard <michael.goddard@nokia.com> | 2011-06-29 13:38:46 +1000 |
---|---|---|
committer | Michael Goddard <michael.goddard@nokia.com> | 2011-06-29 13:38:46 +1000 |
commit | 2a34e88c1e1ced28e75c487cd13402e1c9cf9fa3 (patch) | |
tree | e6c1b770c5c47212792a1f9344fa034ea3e54c44 /examples/camera |
Initial copy of QtMultimediaKit.
Comes from original repo, with SHA1:
2c82d5611655e5967f5c5095af50c0991c4378b2
Diffstat (limited to 'examples/camera')
-rw-r--r-- | examples/camera/camera.cpp | 440 | ||||
-rw-r--r-- | examples/camera/camera.h | 126 | ||||
-rw-r--r-- | examples/camera/camera.pro | 33 | ||||
-rw-r--r-- | examples/camera/camera.ui | 492 | ||||
-rw-r--r-- | examples/camera/camerakeyevent_symbian/camerakeyevent_symbian.cpp | 101 | ||||
-rw-r--r-- | examples/camera/camerakeyevent_symbian/camerakeyevent_symbian.h | 87 | ||||
-rw-r--r-- | examples/camera/camerakeyevent_symbian/camerakeyevent_symbian.pri | 7 | ||||
-rw-r--r-- | examples/camera/imagesettings.cpp | 126 | ||||
-rw-r--r-- | examples/camera/imagesettings.h | 84 | ||||
-rw-r--r-- | examples/camera/imagesettings.ui | 123 | ||||
-rw-r--r-- | examples/camera/main.cpp | 72 | ||||
-rw-r--r-- | examples/camera/videosettings.cpp | 191 | ||||
-rw-r--r-- | examples/camera/videosettings.h | 84 | ||||
-rw-r--r-- | examples/camera/videosettings.ui | 211 |
14 files changed, 2177 insertions, 0 deletions
diff --git a/examples/camera/camera.cpp b/examples/camera/camera.cpp new file mode 100644 index 000000000..ab8ebf33d --- /dev/null +++ b/examples/camera/camera.cpp @@ -0,0 +1,440 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "camera.h" +#include "ui_camera.h" +#include "videosettings.h" +#include "imagesettings.h" + +#include <qmediaservice.h> +#include <qmediarecorder.h> +#include <qcamera.h> +#include <qcameraviewfinder.h> + +#include <qmessagebox.h> +#include <qpalette.h> + +#include <QtGui> + +#if (defined(Q_WS_MAEMO_5) || defined(Q_WS_MAEMO_6)) && QT_VERSION >= 0x040700 +#define HAVE_CAMERA_BUTTONS +#endif + +Camera::Camera(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::Camera), + camera(0), + imageCapture(0), + mediaRecorder(0), + isCapturingImage(false), + applicationExiting(false) +{ + ui->setupUi(this); + + //Camera devices: + QByteArray cameraDevice; + + QActionGroup *videoDevicesGroup = new QActionGroup(this); + videoDevicesGroup->setExclusive(true); + foreach(const QByteArray &deviceName, QCamera::availableDevices()) { + QString description = camera->deviceDescription(deviceName); + QAction *videoDeviceAction = new QAction(description, videoDevicesGroup); + videoDeviceAction->setCheckable(true); + videoDeviceAction->setData(QVariant(deviceName)); + if (cameraDevice.isEmpty()) { + cameraDevice = deviceName; + videoDeviceAction->setChecked(true); + } + ui->menuDevices->addAction(videoDeviceAction); + } + + connect(videoDevicesGroup, SIGNAL(triggered(QAction*)), this, SLOT(updateCameraDevice(QAction*))); + connect(ui->captureWidget, SIGNAL(currentChanged(int)), SLOT(updateCaptureMode())); + +#ifdef HAVE_CAMERA_BUTTONS + ui->lockButton->hide(); +#endif + + setCamera(cameraDevice); +} + +Camera::~Camera() +{ + delete mediaRecorder; + delete imageCapture; + delete camera; +} + +void Camera::setCamera(const QByteArray &cameraDevice) +{ + delete imageCapture; + delete mediaRecorder; + delete camera; + + if (cameraDevice.isEmpty()) + camera = new QCamera; + else + camera = new QCamera(cameraDevice); + + connect(camera, SIGNAL(stateChanged(QCamera::State)), this, SLOT(updateCameraState(QCamera::State))); + connect(camera, SIGNAL(error(QCamera::Error)), this, SLOT(displayCameraError())); + + mediaRecorder = new QMediaRecorder(camera); + connect(mediaRecorder, SIGNAL(stateChanged(QMediaRecorder::State)), this, SLOT(updateRecorderState(QMediaRecorder::State))); + + imageCapture = new QCameraImageCapture(camera); + + connect(mediaRecorder, SIGNAL(durationChanged(qint64)), this, SLOT(updateRecordTime())); + connect(mediaRecorder, SIGNAL(error(QMediaRecorder::Error)), this, SLOT(displayRecorderError())); + + mediaRecorder->setMetaData(QtMultimediaKit::Title, QVariant(QLatin1String("Test Title"))); + + connect(ui->exposureCompensation, SIGNAL(valueChanged(int)), SLOT(setExposureCompensation(int))); + + camera->setViewfinder(ui->viewfinder); + + updateCameraState(camera->state()); + updateLockStatus(camera->lockStatus(), QCamera::UserRequest); + updateRecorderState(mediaRecorder->state()); + + connect(imageCapture, SIGNAL(readyForCaptureChanged(bool)), this, SLOT(readyForCapture(bool))); + connect(imageCapture, SIGNAL(imageCaptured(int,QImage)), this, SLOT(processCapturedImage(int,QImage))); + connect(imageCapture, SIGNAL(imageSaved(int,QString)), this, SLOT(imageSaved(int,QString))); + + connect(camera, SIGNAL(lockStatusChanged(QCamera::LockStatus, QCamera::LockChangeReason)), + this, SLOT(updateLockStatus(QCamera::LockStatus, QCamera::LockChangeReason))); + + ui->captureWidget->setTabEnabled(0, (camera->isCaptureModeSupported(QCamera::CaptureStillImage))); + ui->captureWidget->setTabEnabled(1, (camera->isCaptureModeSupported(QCamera::CaptureVideo))); + + updateCaptureMode(); + camera->start(); +} + +void Camera::keyPressEvent(QKeyEvent * event) +{ + if (event->isAutoRepeat()) + return; + + switch (event->key()) { +#if QT_VERSION >= 0x040700 + case Qt::Key_CameraFocus: + displayViewfinder(); + camera->searchAndLock(); + event->accept(); + break; + case Qt::Key_Camera: + if (camera->captureMode() == QCamera::CaptureStillImage) { + takeImage(); + } else { + if (mediaRecorder->state() == QMediaRecorder::RecordingState) + stop(); + else + record(); + } + event->accept(); + break; +#endif + default: + QMainWindow::keyPressEvent(event); + } +} + +void Camera::keyReleaseEvent(QKeyEvent * event) +{ + if (event->isAutoRepeat()) + return; + + switch (event->key()) { +#if QT_VERSION >= 0x040700 + case Qt::Key_CameraFocus: + camera->unlock(); + break; +#endif + default: + QMainWindow::keyReleaseEvent(event); + } +} + +void Camera::updateRecordTime() +{ + QString str = QString("Recorded %1 sec").arg(mediaRecorder->duration()/1000); + ui->statusbar->showMessage(str); +} + +void Camera::processCapturedImage(int requestId, const QImage& img) +{ + Q_UNUSED(requestId); + QImage scaledImage = img.scaled(ui->viewfinder->size(), + Qt::KeepAspectRatio, + Qt::SmoothTransformation); + + ui->lastImagePreviewLabel->setPixmap(QPixmap::fromImage(scaledImage)); + //display captured image for 4 seconds + displayCapturedImage(); + QTimer::singleShot(4000, this, SLOT(displayViewfinder())); +} + +void Camera::configureCaptureSettings() +{ + switch (camera->captureMode()) { + case QCamera::CaptureStillImage: + configureImageSettings(); + break; + case QCamera::CaptureVideo: + configureVideoSettings(); + break; + default: + break; + } +} + +void Camera::configureVideoSettings() +{ + VideoSettings settingsDialog(mediaRecorder); + + settingsDialog.setAudioSettings(audioSettings); + settingsDialog.setVideoSettings(videoSettings); + settingsDialog.setFormat(videoContainerFormat); + + if (settingsDialog.exec()) { + audioSettings = settingsDialog.audioSettings(); + videoSettings = settingsDialog.videoSettings(); + videoContainerFormat = settingsDialog.format(); + + mediaRecorder->setEncodingSettings( + audioSettings, + videoSettings, + videoContainerFormat); + } +} + +void Camera::configureImageSettings() +{ + ImageSettings settingsDialog(imageCapture); + + settingsDialog.setImageSettings(imageSettings); + + if (settingsDialog.exec()) { + imageSettings = settingsDialog.imageSettings(); + imageCapture->setEncodingSettings(imageSettings); + } +} + +void Camera::record() +{ + mediaRecorder->record(); + updateRecordTime(); +} + +void Camera::pause() +{ + mediaRecorder->pause(); +} + +void Camera::stop() +{ + mediaRecorder->stop(); +} + +void Camera::setMuted(bool muted) +{ + mediaRecorder->setMuted(muted); +} + +void Camera::toggleLock() +{ + switch (camera->lockStatus()) { + case QCamera::Searching: + case QCamera::Locked: + camera->unlock(); + break; + case QCamera::Unlocked: + camera->searchAndLock(); + } +} + +void Camera::updateLockStatus(QCamera::LockStatus status, QCamera::LockChangeReason reason) +{ + QColor indicationColor = Qt::black; + + switch (status) { + case QCamera::Searching: + indicationColor = Qt::yellow; + ui->statusbar->showMessage(tr("Focusing...")); + ui->lockButton->setText(tr("Focusing...")); + break; + case QCamera::Locked: + indicationColor = Qt::darkGreen; + ui->lockButton->setText(tr("Unlock")); + ui->statusbar->showMessage(tr("Focused"), 2000); + break; + case QCamera::Unlocked: + indicationColor = reason == QCamera::LockFailed ? Qt::red : Qt::black; + ui->lockButton->setText(tr("Focus")); + if (reason == QCamera::LockFailed) + ui->statusbar->showMessage(tr("Focus Failed"), 2000); + } + + QPalette palette = ui->lockButton->palette(); + palette.setColor(QPalette::ButtonText, indicationColor); + ui->lockButton->setPalette(palette); +} + +void Camera::takeImage() + +{ + isCapturingImage = true; + imageCapture->capture(); +} + +void Camera::startCamera() +{ + camera->start(); +} + +void Camera::stopCamera() +{ + camera->stop(); +} + +void Camera::updateCaptureMode() +{ + int tabIndex = ui->captureWidget->currentIndex(); + QCamera::CaptureMode captureMode = tabIndex == 0 ? QCamera::CaptureStillImage : QCamera::CaptureVideo; + + if (camera->isCaptureModeSupported(captureMode)) + camera->setCaptureMode(captureMode); +} + +void Camera::updateCameraState(QCamera::State state) +{ + switch (state) { + case QCamera::ActiveState: + ui->actionStartCamera->setEnabled(false); + ui->actionStopCamera->setEnabled(true); + ui->captureWidget->setEnabled(true); + ui->actionSettings->setEnabled(true); + break; + case QCamera::UnloadedState: + case QCamera::LoadedState: + ui->actionStartCamera->setEnabled(true); + ui->actionStopCamera->setEnabled(false); + ui->captureWidget->setEnabled(false); + ui->actionSettings->setEnabled(false); + } +} + +void Camera::updateRecorderState(QMediaRecorder::State state) +{ + switch (state) { + case QMediaRecorder::StoppedState: + ui->recordButton->setEnabled(true); + ui->pauseButton->setEnabled(true); + ui->stopButton->setEnabled(false); + break; + case QMediaRecorder::PausedState: + ui->recordButton->setEnabled(true); + ui->pauseButton->setEnabled(false); + ui->stopButton->setEnabled(true); + break; + case QMediaRecorder::RecordingState: + ui->recordButton->setEnabled(false); + ui->pauseButton->setEnabled(true); + ui->stopButton->setEnabled(true); + break; + } +} + +void Camera::setExposureCompensation(int index) +{ + camera->exposure()->setExposureCompensation(index*0.5); +} + +void Camera::displayRecorderError() +{ + QMessageBox::warning(this, tr("Capture error"), mediaRecorder->errorString()); +} + +void Camera::displayCameraError() +{ + QMessageBox::warning(this, tr("Camera error"), camera->errorString()); +} + +void Camera::updateCameraDevice(QAction *action) +{ + setCamera(action->data().toByteArray()); +} + +void Camera::displayViewfinder() +{ + ui->stackedWidget->setCurrentIndex(0); +} + +void Camera::displayCapturedImage() +{ + ui->stackedWidget->setCurrentIndex(1); +} + +void Camera::readyForCapture(bool ready) +{ + ui->takeImageButton->setEnabled(ready); +} + +void Camera::imageSaved(int id, const QString &fileName) +{ + Q_UNUSED(id); + Q_UNUSED(fileName); + + isCapturingImage = false; + if (applicationExiting) + close(); +} + +void Camera::closeEvent(QCloseEvent *event) +{ + if (isCapturingImage) { + setEnabled(false); + applicationExiting = true; + event->ignore(); + } else { + event->accept(); + } +} diff --git a/examples/camera/camera.h b/examples/camera/camera.h new file mode 100644 index 000000000..e569baf31 --- /dev/null +++ b/examples/camera/camera.h @@ -0,0 +1,126 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef CAMERA_H +#define CAMERA_H + +#include <qcamera.h> +#include <qmediarecorder.h> +#include <qcameraimagecapture.h> + +QT_BEGIN_NAMESPACE +namespace Ui { + class Camera; +} +class QCameraViewfinder; +QT_END_NAMESPACE + +#include <QMainWindow> +#include <QDir> + +QT_USE_NAMESPACE + +class Camera : public QMainWindow +{ + Q_OBJECT +public: + Camera(QWidget *parent = 0); + ~Camera(); + +private slots: + void setCamera(const QByteArray &cameraDevice); + + void startCamera(); + void stopCamera(); + + void record(); + void pause(); + void stop(); + void setMuted(bool); + + void toggleLock(); + void takeImage(); + + void configureCaptureSettings(); + void configureVideoSettings(); + void configureImageSettings(); + + void displayRecorderError(); + void displayCameraError(); + + void updateCameraDevice(QAction*); + + void updateCameraState(QCamera::State); + void updateCaptureMode(); + void updateRecorderState(QMediaRecorder::State state); + void setExposureCompensation(int index); + + void updateRecordTime(); + + void processCapturedImage(int requestId, const QImage& img); + void updateLockStatus(QCamera::LockStatus, QCamera::LockChangeReason); + + void displayViewfinder(); + void displayCapturedImage(); + + void readyForCapture(bool); + void imageSaved(int, const QString&); + +protected: + void keyPressEvent(QKeyEvent * event); + void keyReleaseEvent(QKeyEvent * event); + void closeEvent(QCloseEvent *event ); + +private: + Ui::Camera *ui; + + QCamera *camera; + QCameraImageCapture *imageCapture; + QMediaRecorder* mediaRecorder; + + QImageEncoderSettings imageSettings; + QAudioEncoderSettings audioSettings; + QVideoEncoderSettings videoSettings; + QString videoContainerFormat; + bool isCapturingImage; + bool applicationExiting; +}; + +#endif diff --git a/examples/camera/camera.pro b/examples/camera/camera.pro new file mode 100644 index 000000000..2d657e887 --- /dev/null +++ b/examples/camera/camera.pro @@ -0,0 +1,33 @@ +TEMPLATE = app +TARGET = camera + +INCLUDEPATH+=../../src/multimedia \ + ../../src/multimedia/video + +include(../mobility_examples.pri) + +CONFIG += mobility +MOBILITY = multimedia + +HEADERS = \ + camera.h \ + imagesettings.h \ + videosettings.h + +SOURCES = \ + main.cpp \ + camera.cpp \ + imagesettings.cpp \ + videosettings.cpp + +FORMS += \ + camera.ui \ + videosettings.ui \ + imagesettings.ui + +symbian { + include(camerakeyevent_symbian/camerakeyevent_symbian.pri) + TARGET.CAPABILITY += UserEnvironment WriteUserData ReadUserData + TARGET.EPOCHEAPSIZE = 0x20000 0x3000000 + LIBS += -lavkon -leiksrv -lcone -leikcore +} diff --git a/examples/camera/camera.ui b/examples/camera/camera.ui new file mode 100644 index 000000000..ea790fab0 --- /dev/null +++ b/examples/camera/camera.ui @@ -0,0 +1,492 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>Camera</class> + <widget class="QMainWindow" name="Camera"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>668</width> + <height>422</height> + </rect> + </property> + <property name="windowTitle"> + <string>Camera</string> + </property> + <widget class="QWidget" name="centralwidget"> + <layout class="QGridLayout" name="gridLayout_3"> + <item row="0" column="0" rowspan="3"> + <widget class="QStackedWidget" name="stackedWidget"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> + <horstretch>1</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="palette"> + <palette> + <active> + <colorrole role="Base"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </brush> + </colorrole> + <colorrole role="Window"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>145</red> + <green>145</green> + <blue>145</blue> + </color> + </brush> + </colorrole> + </active> + <inactive> + <colorrole role="Base"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>255</red> + <green>255</green> + <blue>255</blue> + </color> + </brush> + </colorrole> + <colorrole role="Window"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>145</red> + <green>145</green> + <blue>145</blue> + </color> + </brush> + </colorrole> + </inactive> + <disabled> + <colorrole role="Base"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>145</red> + <green>145</green> + <blue>145</blue> + </color> + </brush> + </colorrole> + <colorrole role="Window"> + <brush brushstyle="SolidPattern"> + <color alpha="255"> + <red>145</red> + <green>145</green> + <blue>145</blue> + </color> + </brush> + </colorrole> + </disabled> + </palette> + </property> + <property name="currentIndex"> + <number>0</number> + </property> + <widget class="QWidget" name="viewfinderPage"> + <layout class="QGridLayout" name="gridLayout_5"> + <item row="0" column="0"> + <widget class="QCameraViewfinder" name="viewfinder" native="true"/> + </item> + </layout> + </widget> + <widget class="QWidget" name="previewPage"> + <layout class="QGridLayout" name="gridLayout_4"> + <item row="0" column="0"> + <widget class="QLabel" name="lastImagePreviewLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="frameShape"> + <enum>QFrame::Box</enum> + </property> + <property name="text"> + <string/> + </property> + </widget> + </item> + </layout> + </widget> + </widget> + </item> + <item row="1" column="1" colspan="2"> + <widget class="QPushButton" name="lockButton"> + <property name="text"> + <string>Focus</string> + </property> + </widget> + </item> + <item row="2" column="1" colspan="2"> + <widget class="QTabWidget" name="captureWidget"> + <property name="currentIndex"> + <number>0</number> + </property> + <widget class="QWidget" name="tab_2"> + <attribute name="title"> + <string>Image</string> + </attribute> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0"> + <widget class="QPushButton" name="takeImageButton"> + <property name="text"> + <string>Capture Photo</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <spacer name="verticalSpacer_2"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>161</height> + </size> + </property> + </spacer> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Exposure Compensation:</string> + </property> + </widget> + </item> + <item row="3" column="0"> + <widget class="QSlider" name="exposureCompensation"> + <property name="minimum"> + <number>-4</number> + </property> + <property name="maximum"> + <number>4</number> + </property> + <property name="pageStep"> + <number>2</number> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="tickPosition"> + <enum>QSlider::TicksAbove</enum> + </property> + </widget> + </item> + </layout> + </widget> + <widget class="QWidget" name="tab"> + <attribute name="title"> + <string>Video</string> + </attribute> + <layout class="QGridLayout" name="gridLayout_2"> + <item row="0" column="0"> + <widget class="QPushButton" name="recordButton"> + <property name="text"> + <string>Record</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QPushButton" name="pauseButton"> + <property name="text"> + <string>Pause</string> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QPushButton" name="stopButton"> + <property name="text"> + <string>Stop</string> + </property> + </widget> + </item> + <item row="3" column="0"> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>76</height> + </size> + </property> + </spacer> + </item> + <item row="4" column="0"> + <widget class="QPushButton" name="muteButton"> + <property name="text"> + <string>Mute</string> + </property> + <property name="checkable"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> + </widget> + </item> + </layout> + </widget> + <widget class="QMenuBar" name="menubar"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>668</width> + <height>29</height> + </rect> + </property> + <widget class="QMenu" name="menuFile"> + <property name="title"> + <string>File</string> + </property> + <addaction name="actionStartCamera"/> + <addaction name="actionStopCamera"/> + <addaction name="separator"/> + <addaction name="actionSettings"/> + <addaction name="separator"/> + <addaction name="actionExit"/> + </widget> + <widget class="QMenu" name="menuDevices"> + <property name="title"> + <string>Devices</string> + </property> + </widget> + <addaction name="menuFile"/> + <addaction name="menuDevices"/> + </widget> + <widget class="QStatusBar" name="statusbar"/> + <action name="actionExit"> + <property name="text"> + <string>Exit</string> + </property> + </action> + <action name="actionStartCamera"> + <property name="text"> + <string>Start Camera</string> + </property> + </action> + <action name="actionStopCamera"> + <property name="text"> + <string>Stop Camera</string> + </property> + </action> + <action name="actionSettings"> + <property name="text"> + <string>Settings</string> + </property> + </action> + </widget> + <customwidgets> + <customwidget> + <class>QCameraViewfinder</class> + <extends>QWidget</extends> + <header>qcameraviewfinder.h</header> + <container>1</container> + </customwidget> + </customwidgets> + <resources/> + <connections> + <connection> + <sender>recordButton</sender> + <signal>clicked()</signal> + <receiver>Camera</receiver> + <slot>record()</slot> + <hints> + <hint type="sourcelabel"> + <x>647</x> + <y>149</y> + </hint> + <hint type="destinationlabel"> + <x>61</x> + <y>238</y> + </hint> + </hints> + </connection> + <connection> + <sender>stopButton</sender> + <signal>clicked()</signal> + <receiver>Camera</receiver> + <slot>stop()</slot> + <hints> + <hint type="sourcelabel"> + <x>647</x> + <y>225</y> + </hint> + <hint type="destinationlabel"> + <x>140</x> + <y>236</y> + </hint> + </hints> + </connection> + <connection> + <sender>pauseButton</sender> + <signal>clicked()</signal> + <receiver>Camera</receiver> + <slot>pause()</slot> + <hints> + <hint type="sourcelabel"> + <x>647</x> + <y>187</y> + </hint> + <hint type="destinationlabel"> + <x>234</x> + <y>237</y> + </hint> + </hints> + </connection> + <connection> + <sender>actionExit</sender> + <signal>triggered()</signal> + <receiver>Camera</receiver> + <slot>close()</slot> + <hints> + <hint type="sourcelabel"> + <x>-1</x> + <y>-1</y> + </hint> + <hint type="destinationlabel"> + <x>154</x> + <y>130</y> + </hint> + </hints> + </connection> + <connection> + <sender>takeImageButton</sender> + <signal>clicked()</signal> + <receiver>Camera</receiver> + <slot>takeImage()</slot> + <hints> + <hint type="sourcelabel"> + <x>625</x> + <y>132</y> + </hint> + <hint type="destinationlabel"> + <x>603</x> + <y>169</y> + </hint> + </hints> + </connection> + <connection> + <sender>lockButton</sender> + <signal>clicked()</signal> + <receiver>Camera</receiver> + <slot>toggleLock()</slot> + <hints> + <hint type="sourcelabel"> + <x>658</x> + <y>75</y> + </hint> + <hint type="destinationlabel"> + <x>453</x> + <y>119</y> + </hint> + </hints> + </connection> + <connection> + <sender>muteButton</sender> + <signal>toggled(bool)</signal> + <receiver>Camera</receiver> + <slot>setMuted(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>647</x> + <y>377</y> + </hint> + <hint type="destinationlabel"> + <x>5</x> + <y>280</y> + </hint> + </hints> + </connection> + <connection> + <sender>exposureCompensation</sender> + <signal>valueChanged(int)</signal> + <receiver>Camera</receiver> + <slot>setExposureCompensation(int)</slot> + <hints> + <hint type="sourcelabel"> + <x>559</x> + <y>367</y> + </hint> + <hint type="destinationlabel"> + <x>665</x> + <y>365</y> + </hint> + </hints> + </connection> + <connection> + <sender>actionSettings</sender> + <signal>triggered()</signal> + <receiver>Camera</receiver> + <slot>configureCaptureSettings()</slot> + <hints> + <hint type="sourcelabel"> + <x>-1</x> + <y>-1</y> + </hint> + <hint type="destinationlabel"> + <x>333</x> + <y>210</y> + </hint> + </hints> + </connection> + <connection> + <sender>actionStartCamera</sender> + <signal>triggered()</signal> + <receiver>Camera</receiver> + <slot>startCamera()</slot> + <hints> + <hint type="sourcelabel"> + <x>-1</x> + <y>-1</y> + </hint> + <hint type="destinationlabel"> + <x>333</x> + <y>210</y> + </hint> + </hints> + </connection> + <connection> + <sender>actionStopCamera</sender> + <signal>triggered()</signal> + <receiver>Camera</receiver> + <slot>stopCamera()</slot> + <hints> + <hint type="sourcelabel"> + <x>-1</x> + <y>-1</y> + </hint> + <hint type="destinationlabel"> + <x>333</x> + <y>210</y> + </hint> + </hints> + </connection> + </connections> + <slots> + <slot>record()</slot> + <slot>pause()</slot> + <slot>stop()</slot> + <slot>enablePreview(bool)</slot> + <slot>configureCaptureSettings()</slot> + <slot>takeImage()</slot> + <slot>startCamera()</slot> + <slot>toggleLock()</slot> + <slot>setMuted(bool)</slot> + <slot>stopCamera()</slot> + <slot>setExposureCompensation(int)</slot> + </slots> +</ui> diff --git a/examples/camera/camerakeyevent_symbian/camerakeyevent_symbian.cpp b/examples/camera/camerakeyevent_symbian/camerakeyevent_symbian.cpp new file mode 100644 index 000000000..30723af40 --- /dev/null +++ b/examples/camera/camerakeyevent_symbian/camerakeyevent_symbian.cpp @@ -0,0 +1,101 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "camerakeyevent_symbian.h" + +#include <QtGui/QWidget> // WId +#include <eikon.hrh> // EKeyCamera +#include <coecntrl.h> // CCoeControl (WId) +#include <w32std.h> // RWindowbase, RWindowGroup, RWsSession + +QSymbianCameraKeyListener::QSymbianCameraKeyListener(QWidget *widget): + QObject(widget), + m_widget(widget) +{ + if (!m_widget) + return; + + // Get view's native Symbian window + WId windowId = 0; + if (m_widget->internalWinId()) + windowId = m_widget->internalWinId(); + else if (m_widget->parentWidget() && m_widget->effectiveWinId()) + windowId = m_widget->effectiveWinId(); + RWindowBase *window = windowId ? static_cast<RWindowBase*>(windowId->DrawableWindow()) : 0; + + // Get hold of the window group + TInt wGroupId = window ? window->WindowGroupId() : 0; + if (!wGroupId) + return; + RWsSession &wsSession = CCoeEnv::Static()->WsSession(); + TUint wGroupHandle = wsSession.GetWindowGroupHandle(wGroupId); + if (wGroupHandle) { + RWindowGroup wGroup(wsSession); + wGroup.Construct(wGroupHandle); + if (wGroup.CaptureKey(EKeyCamera, 0, 0, 100) < 0) + qWarning("Unable to register for camera capture key events, SwEvent capability may be missing"); + } +} + +QSymbianCameraKeyListener::~QSymbianCameraKeyListener() +{ + if (!m_widget) + return; + + // Get view's native Symbian window + WId windowId = 0; + if (m_widget->internalWinId()) + windowId = m_widget->internalWinId(); + else if (m_widget->parentWidget() && m_widget->effectiveWinId()) + windowId = m_widget->effectiveWinId(); + RWindowBase *window = windowId ? static_cast<RWindowBase*>(windowId->DrawableWindow()) : 0; + + // Get hold of the window group + TInt wGroupId = window ? window->WindowGroupId() : 0; + if (!wGroupId) + return; + RWsSession &wsSession = CCoeEnv::Static()->WsSession(); + TUint wGroupHandle = wsSession.GetWindowGroupHandle(wGroupId); + if (wGroupHandle) { + RWindowGroup wGroup(wsSession); + wGroup.Construct(wGroupHandle); + wGroup.CancelCaptureKey(EKeyCamera); + } +} diff --git a/examples/camera/camerakeyevent_symbian/camerakeyevent_symbian.h b/examples/camera/camerakeyevent_symbian/camerakeyevent_symbian.h new file mode 100644 index 000000000..4cd5701b9 --- /dev/null +++ b/examples/camera/camerakeyevent_symbian/camerakeyevent_symbian.h @@ -0,0 +1,87 @@ +#ifndef CAMERAKEYEVENT_SYMBIAN_H +#define CAMERAKEYEVENT_SYMBIAN_H + +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/* + * Description: + * This header can be used to register application on Symbian platforms + * for the Camera capture button key events. Application can avoid native + * camera application from starting by not forwarding the key event. + * + * Usage: + * Application needs to include this header and include the needed Symbian + * libraries. Optionally application can include camerakeyevent_symbian.pri + * file. Application can register and unregister for the Camera capture + * key events by creating/destructing the QSymbianCameraKeyListener helper + * object. The widget needs to be shown before it registers for the + * Camera key event. + * + * Libraries needed: + * User needs to define following in the .pro file (or optionally include + * the camerakeyevent_symbian.pri): + * LIBS += -lcone -lws32 + * + * Symbian Capabilities needed: + * To use this header user needs to have SwEvent capability (included in + * the camerakeyevent_symbian.pri): + * TARGET.CAPABILITY += SwEvent + */ + +#include <QtCore/QObject> + +QT_BEGIN_NAMESPACE +QT_FORWARD_DECLARE_CLASS(QWidget) +QT_END_NAMESPACE + +QT_USE_NAMESPACE + +class QSymbianCameraKeyListener : public QObject +{ + Q_OBJECT +public: + QSymbianCameraKeyListener(QWidget *parent = 0); + ~QSymbianCameraKeyListener(); +private: + QWidget *m_widget; +}; + +#endif // CAMERAKEYEVENT_SYMBIAN_H diff --git a/examples/camera/camerakeyevent_symbian/camerakeyevent_symbian.pri b/examples/camera/camerakeyevent_symbian/camerakeyevent_symbian.pri new file mode 100644 index 000000000..097c3b245 --- /dev/null +++ b/examples/camera/camerakeyevent_symbian/camerakeyevent_symbian.pri @@ -0,0 +1,7 @@ +message("camerakeyevent_symbian: Including Symbian camera capture key event register methods") + +HEADERS += $$PWD/camerakeyevent_symbian.h +SOURCES += $$PWD/camerakeyevent_symbian.cpp +INCLUDEPATH += $$PWD +LIBS *= -lcone -lws32 +TARGET.CAPABILITY *= SwEvent diff --git a/examples/camera/imagesettings.cpp b/examples/camera/imagesettings.cpp new file mode 100644 index 000000000..a7f389bb9 --- /dev/null +++ b/examples/camera/imagesettings.cpp @@ -0,0 +1,126 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "imagesettings.h" +#include "ui_imagesettings.h" + +#include <QtGui/qcombobox.h> +#include <QtCore/qdebug.h> +#include <qcameraimagecapture.h> +#include <qmediaservice.h> + + + +ImageSettings::ImageSettings(QCameraImageCapture *imageCapture, QWidget *parent) : + QDialog(parent), + ui(new Ui::ImageSettingsUi), + imagecapture(imageCapture) +{ + ui->setupUi(this); + + //image codecs + ui->imageCodecBox->addItem(tr("Default image format"), QVariant(QString())); + foreach(const QString &codecName, imagecapture->supportedImageCodecs()) { + QString description = imagecapture->imageCodecDescription(codecName); + ui->imageCodecBox->addItem(codecName+": "+description, QVariant(codecName)); + } + + ui->imageQualitySlider->setRange(0, int(QtMultimediaKit::VeryHighQuality)); + + ui->imageResolutionBox->addItem(tr("Default Resolution")); + QList<QSize> supportedResolutions = imagecapture->supportedResolutions(); + foreach(const QSize &resolution, supportedResolutions) { + ui->imageResolutionBox->addItem(QString("%1x%2").arg(resolution.width()).arg(resolution.height()), + QVariant(resolution)); + } +} + +ImageSettings::~ImageSettings() +{ + delete ui; +} + +void ImageSettings::changeEvent(QEvent *e) +{ + QDialog::changeEvent(e); + switch (e->type()) { + case QEvent::LanguageChange: + ui->retranslateUi(this); + break; + default: + break; + } +} + +QImageEncoderSettings ImageSettings::imageSettings() const +{ + QImageEncoderSettings settings = imagecapture->encodingSettings(); + settings.setCodec(boxValue(ui->imageCodecBox).toString()); + settings.setQuality(QtMultimediaKit::EncodingQuality(ui->imageQualitySlider->value())); + settings.setResolution(boxValue(ui->imageResolutionBox).toSize()); + + return settings; +} + +void ImageSettings::setImageSettings(const QImageEncoderSettings &imageSettings) +{ + selectComboBoxItem(ui->imageCodecBox, QVariant(imageSettings.codec())); + selectComboBoxItem(ui->imageResolutionBox, QVariant(imageSettings.resolution())); + ui->imageQualitySlider->setValue(imageSettings.quality()); +} + +QVariant ImageSettings::boxValue(const QComboBox *box) const +{ + int idx = box->currentIndex(); + if (idx == -1) + return QVariant(); + + return box->itemData(idx); +} + +void ImageSettings::selectComboBoxItem(QComboBox *box, const QVariant &value) +{ + for (int i=0; i<box->count(); i++) { + if (box->itemData(i) == value) { + box->setCurrentIndex(i); + break; + } + } +} diff --git a/examples/camera/imagesettings.h b/examples/camera/imagesettings.h new file mode 100644 index 000000000..b4b000f6a --- /dev/null +++ b/examples/camera/imagesettings.h @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef IMAGESETTINGS_H +#define IMAGESETTINGS_H + +#include <QtGui/QDialog> +#include <qmediaencodersettings.h> + +QT_BEGIN_NAMESPACE +class QComboBox; +namespace Ui { + class ImageSettingsUi; +} + +class QCameraImageCapture; +QT_END_NAMESPACE + +QT_USE_NAMESPACE + +class ImageSettings : public QDialog { + Q_OBJECT +public: + ImageSettings(QCameraImageCapture *imageCapture, QWidget *parent = 0); + ~ImageSettings(); + + QAudioEncoderSettings audioSettings() const; + void setAudioSettings(const QAudioEncoderSettings&); + + QImageEncoderSettings imageSettings() const; + void setImageSettings(const QImageEncoderSettings&); + + QString format() const; + void setFormat(const QString &format); + +protected: + void changeEvent(QEvent *e); + +private: + QVariant boxValue(const QComboBox*) const; + void selectComboBoxItem(QComboBox *box, const QVariant &value); + + Ui::ImageSettingsUi *ui; + QCameraImageCapture *imagecapture; +}; + +#endif // IMAGESETTINGS_H diff --git a/examples/camera/imagesettings.ui b/examples/camera/imagesettings.ui new file mode 100644 index 000000000..f790c770d --- /dev/null +++ b/examples/camera/imagesettings.ui @@ -0,0 +1,123 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>ImageSettingsUi</class> + <widget class="QDialog" name="ImageSettingsUi"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>332</width> + <height>270</height> + </rect> + </property> + <property name="windowTitle"> + <string>Dialog</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0"> + <widget class="QGroupBox" name="groupBox_2"> + <property name="title"> + <string>Image</string> + </property> + <layout class="QGridLayout" name="gridLayout_2"> + <item row="0" column="0" colspan="2"> + <widget class="QLabel" name="label_8"> + <property name="text"> + <string>Resolution:</string> + </property> + </widget> + </item> + <item row="1" column="0" colspan="2"> + <widget class="QComboBox" name="imageResolutionBox"/> + </item> + <item row="2" column="0" colspan="2"> + <widget class="QLabel" name="label_6"> + <property name="text"> + <string>Image Format:</string> + </property> + </widget> + </item> + <item row="3" column="0" colspan="2"> + <widget class="QComboBox" name="imageCodecBox"/> + </item> + <item row="4" column="0"> + <widget class="QLabel" name="label_7"> + <property name="text"> + <string>Quality:</string> + </property> + </widget> + </item> + <item row="4" column="1"> + <widget class="QSlider" name="imageQualitySlider"> + <property name="maximum"> + <number>4</number> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item row="1" column="0"> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>14</height> + </size> + </property> + </spacer> + </item> + <item row="2" column="0"> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>ImageSettingsUi</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>322</x> + <y>272</y> + </hint> + <hint type="destinationlabel"> + <x>44</x> + <y>230</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>ImageSettingsUi</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>405</x> + <y>262</y> + </hint> + <hint type="destinationlabel"> + <x>364</x> + <y>227</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/examples/camera/main.cpp b/examples/camera/main.cpp new file mode 100644 index 000000000..7fd9a61f7 --- /dev/null +++ b/examples/camera/main.cpp @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "camera.h" +#ifdef Q_OS_SYMBIAN +#include "camerakeyevent_symbian.h" +#endif // Q_OS_SYMBIAN + +#include <QtGui> + +int main(int argc, char *argv[]) +{ +#if defined (Q_OS_SYMBIAN) + QApplication::setGraphicsSystem("raster"); + QApplication app(argc, argv); + // lock orientation before constructing camera + CAknAppUi* appUi = dynamic_cast<CAknAppUi*>(CEikonEnv::Static()->AppUi()); + if(appUi){ + QT_TRAP_THROWING(appUi ->SetOrientationL(CAknAppUi::EAppUiOrientationLandscape)); + } +#else + QApplication app(argc, argv); +#endif + + Camera camera; + +#ifdef Q_OS_SYMBIAN + camera.showMaximized(); + new QSymbianCameraKeyListener(&camera); +#else + camera.show(); +#endif + + return app.exec(); +}; diff --git a/examples/camera/videosettings.cpp b/examples/camera/videosettings.cpp new file mode 100644 index 000000000..f6beb70b5 --- /dev/null +++ b/examples/camera/videosettings.cpp @@ -0,0 +1,191 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "videosettings.h" +#include "ui_videosettings.h" + +#include <QtGui/qcombobox.h> +#include <QtCore/qdebug.h> +#include <qmediarecorder.h> +#include <qmediaservice.h> + + +VideoSettings::VideoSettings(QMediaRecorder *mediaRecorder, QWidget *parent) : + QDialog(parent), + ui(new Ui::VideoSettingsUi), + mediaRecorder(mediaRecorder) +{ + ui->setupUi(this); + + //audio codecs + ui->audioCodecBox->addItem(tr("Default audio codec"), QVariant(QString())); + foreach(const QString &codecName, mediaRecorder->supportedAudioCodecs()) { + QString description = mediaRecorder->audioCodecDescription(codecName); + ui->audioCodecBox->addItem(codecName+": "+description, QVariant(codecName)); + } + + //sample rate: + foreach(int sampleRate, mediaRecorder->supportedAudioSampleRates()) { + ui->audioSampleRateBox->addItem(QString::number(sampleRate), QVariant(sampleRate)); + } + + ui->audioQualitySlider->setRange(0, int(QtMultimediaKit::VeryHighQuality)); + + //video codecs + ui->videoCodecBox->addItem(tr("Default video codec"), QVariant(QString())); + foreach(const QString &codecName, mediaRecorder->supportedVideoCodecs()) { + QString description = mediaRecorder->videoCodecDescription(codecName); + ui->videoCodecBox->addItem(codecName+": "+description, QVariant(codecName)); + } + + ui->videoQualitySlider->setRange(0, int(QtMultimediaKit::VeryHighQuality)); + + + ui->videoResolutionBox->addItem(tr("Default")); + QList<QSize> supportedResolutions = mediaRecorder->supportedResolutions(); + foreach(const QSize &resolution, supportedResolutions) { + ui->videoResolutionBox->addItem(QString("%1x%2").arg(resolution.width()).arg(resolution.height()), + QVariant(resolution)); + } + + ui->videoFramerateBox->addItem(tr("Default")); + QList<qreal> supportedFrameRates = mediaRecorder->supportedFrameRates(); + qreal rate; + foreach(rate, supportedFrameRates) { + QString rateString = QString("%1").arg(rate, 0, 'f', 2); + ui->videoFramerateBox->addItem(rateString, QVariant(rate)); + } + + //containers + ui->containerFormatBox->addItem(tr("Default container"), QVariant(QString())); + foreach(const QString &format, mediaRecorder->supportedContainers()) { + ui->containerFormatBox->addItem(format+":"+mediaRecorder->containerDescription(format), + QVariant(format)); + } +} + +VideoSettings::~VideoSettings() +{ + delete ui; +} + +void VideoSettings::changeEvent(QEvent *e) +{ + QDialog::changeEvent(e); + switch (e->type()) { + case QEvent::LanguageChange: + ui->retranslateUi(this); + break; + default: + break; + } +} + +QAudioEncoderSettings VideoSettings::audioSettings() const +{ + QAudioEncoderSettings settings = mediaRecorder->audioSettings(); + settings.setCodec(boxValue(ui->audioCodecBox).toString()); + settings.setQuality(QtMultimediaKit::EncodingQuality(ui->audioQualitySlider->value())); + settings.setSampleRate(boxValue(ui->audioSampleRateBox).toInt()); + return settings; +} + +void VideoSettings::setAudioSettings(const QAudioEncoderSettings &audioSettings) +{ + selectComboBoxItem(ui->audioCodecBox, QVariant(audioSettings.codec())); + selectComboBoxItem(ui->audioSampleRateBox, QVariant(audioSettings.sampleRate())); + ui->audioQualitySlider->setValue(audioSettings.quality()); +} + +QVideoEncoderSettings VideoSettings::videoSettings() const +{ + QVideoEncoderSettings settings = mediaRecorder->videoSettings(); + settings.setCodec(boxValue(ui->videoCodecBox).toString()); + settings.setQuality(QtMultimediaKit::EncodingQuality(ui->videoQualitySlider->value())); + settings.setResolution(boxValue(ui->videoResolutionBox).toSize()); + settings.setFrameRate(boxValue(ui->videoFramerateBox).value<qreal>()); + + return settings; +} + +void VideoSettings::setVideoSettings(const QVideoEncoderSettings &videoSettings) +{ + selectComboBoxItem(ui->videoCodecBox, QVariant(videoSettings.codec())); + selectComboBoxItem(ui->videoResolutionBox, QVariant(videoSettings.resolution())); + ui->videoQualitySlider->setValue(videoSettings.quality()); + + //special case for frame rate + for (int i=0; i<ui->videoFramerateBox->count(); i++) { + qreal itemRate = ui->videoFramerateBox->itemData(i).value<qreal>(); + if (qFuzzyCompare(itemRate, videoSettings.frameRate())) { + ui->videoFramerateBox->setCurrentIndex(i); + break; + } + } +} + +QString VideoSettings::format() const +{ + return boxValue(ui->containerFormatBox).toString(); +} + +void VideoSettings::setFormat(const QString &format) +{ + selectComboBoxItem(ui->containerFormatBox, QVariant(format)); +} + +QVariant VideoSettings::boxValue(const QComboBox *box) const +{ + int idx = box->currentIndex(); + if (idx == -1) + return QVariant(); + + return box->itemData(idx); +} + +void VideoSettings::selectComboBoxItem(QComboBox *box, const QVariant &value) +{ + for (int i=0; i<box->count(); i++) { + if (box->itemData(i) == value) { + box->setCurrentIndex(i); + break; + } + } +} diff --git a/examples/camera/videosettings.h b/examples/camera/videosettings.h new file mode 100644 index 000000000..8eeea35b1 --- /dev/null +++ b/examples/camera/videosettings.h @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef VIDEOSETTINGS_H +#define VIDEOSETTINGS_H + +#include <QtGui/QDialog> +#include <qmediaencodersettings.h> + +QT_BEGIN_NAMESPACE +class QComboBox; +namespace Ui { + class VideoSettingsUi; +} + +class QMediaRecorder; +QT_END_NAMESPACE + +QT_USE_NAMESPACE + +class VideoSettings : public QDialog { + Q_OBJECT +public: + VideoSettings(QMediaRecorder *mediaRecorder, QWidget *parent = 0); + ~VideoSettings(); + + QAudioEncoderSettings audioSettings() const; + void setAudioSettings(const QAudioEncoderSettings&); + + QVideoEncoderSettings videoSettings() const; + void setVideoSettings(const QVideoEncoderSettings&); + + QString format() const; + void setFormat(const QString &format); + +protected: + void changeEvent(QEvent *e); + +private: + QVariant boxValue(const QComboBox*) const; + void selectComboBoxItem(QComboBox *box, const QVariant &value); + + Ui::VideoSettingsUi *ui; + QMediaRecorder *mediaRecorder; +}; + +#endif // VIDEOSETTINGS_H diff --git a/examples/camera/videosettings.ui b/examples/camera/videosettings.ui new file mode 100644 index 000000000..f6aa004c5 --- /dev/null +++ b/examples/camera/videosettings.ui @@ -0,0 +1,211 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>VideoSettingsUi</class> + <widget class="QDialog" name="VideoSettingsUi"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>561</width> + <height>369</height> + </rect> + </property> + <property name="windowTitle"> + <string>Dialog</string> + </property> + <layout class="QGridLayout" name="gridLayout_4"> + <item row="0" column="0"> + <widget class="QScrollArea" name="scrollArea"> + <property name="frameShape"> + <enum>QFrame::NoFrame</enum> + </property> + <property name="widgetResizable"> + <bool>true</bool> + </property> + <widget class="QWidget" name="scrollAreaWidgetContents"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>543</width> + <height>250</height> + </rect> + </property> + <layout class="QGridLayout" name="gridLayout_3"> + <item row="0" column="0"> + <widget class="QGroupBox" name="groupBox"> + <property name="title"> + <string>Audio</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0" colspan="2"> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Audio Codec:</string> + </property> + </widget> + </item> + <item row="1" column="0" colspan="2"> + <widget class="QComboBox" name="audioCodecBox"/> + </item> + <item row="2" column="0" colspan="2"> + <widget class="QLabel" name="label_5"> + <property name="text"> + <string>Sample Rate:</string> + </property> + </widget> + </item> + <item row="3" column="0" colspan="2"> + <widget class="QComboBox" name="audioSampleRateBox"/> + </item> + <item row="4" column="0"> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>Quality:</string> + </property> + </widget> + </item> + <item row="4" column="1"> + <widget class="QSlider" name="audioQualitySlider"> + <property name="maximum"> + <number>4</number> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item row="0" column="1" rowspan="3"> + <widget class="QGroupBox" name="groupBox_2"> + <property name="title"> + <string>Video</string> + </property> + <layout class="QGridLayout" name="gridLayout_2"> + <item row="0" column="0" colspan="2"> + <widget class="QLabel" name="label_8"> + <property name="text"> + <string>Resolution:</string> + </property> + </widget> + </item> + <item row="1" column="0" colspan="2"> + <widget class="QComboBox" name="videoResolutionBox"/> + </item> + <item row="2" column="0" colspan="2"> + <widget class="QLabel" name="label_9"> + <property name="text"> + <string>Framerate:</string> + </property> + </widget> + </item> + <item row="3" column="0" colspan="2"> + <widget class="QComboBox" name="videoFramerateBox"/> + </item> + <item row="4" column="0" colspan="2"> + <widget class="QLabel" name="label_6"> + <property name="text"> + <string>Video Codec:</string> + </property> + </widget> + </item> + <item row="5" column="0" colspan="2"> + <widget class="QComboBox" name="videoCodecBox"/> + </item> + <item row="6" column="0"> + <widget class="QLabel" name="label_7"> + <property name="text"> + <string>Quality:</string> + </property> + </widget> + </item> + <item row="6" column="1"> + <widget class="QSlider" name="videoQualitySlider"> + <property name="maximum"> + <number>4</number> + </property> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_4"> + <property name="text"> + <string>Container Format:</string> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QComboBox" name="containerFormatBox"/> + </item> + </layout> + </widget> + </widget> + </item> + <item row="1" column="0"> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>14</height> + </size> + </property> + </spacer> + </item> + <item row="2" column="0"> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>VideoSettingsUi</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>322</x> + <y>272</y> + </hint> + <hint type="destinationlabel"> + <x>44</x> + <y>230</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>VideoSettingsUi</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>405</x> + <y>262</y> + </hint> + <hint type="destinationlabel"> + <x>364</x> + <y>227</y> + </hint> + </hints> + </connection> + </connections> +</ui> |