aboutsummaryrefslogtreecommitdiffstats
path: root/examples/multimedia
diff options
context:
space:
mode:
authorShyamnath Premnadh <Shyamnath.Premnadh@qt.io>2023-09-22 12:16:03 +0200
committerShyamnath Premnadh <Shyamnath.Premnadh@qt.io>2023-10-02 18:20:53 +0200
commit20bd006663ca640baf19bcc5a4f80899cd6eb2da (patch)
treef68df85196c22ace84c1082db049d5536073cefd /examples/multimedia
parent0f98cb69d4e8a2beec64102abef97b46aa7626ba (diff)
Example Revamp: Camera
- Changes as per e3c0c190136a55634451024cfa3ac8024c74caa3 - New UI for Android as per the corresponding Qt example - Add the new permission API functions to request and check for Android runtime permissions - Update .pyproject file Task-number: PYSIDE-1612 Task-number: PYSIDE-2206 Pick-to: 6.6 Change-Id: I8b9c41c6cd12388addb5a8a4049c1126b62e098b Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Diffstat (limited to 'examples/multimedia')
-rw-r--r--examples/multimedia/camera/camera.py51
-rw-r--r--examples/multimedia/camera/camera.pyproject4
-rw-r--r--examples/multimedia/camera/camera_mobile.ui504
-rw-r--r--examples/multimedia/camera/ui_camera_mobile.py251
-rw-r--r--examples/multimedia/camera/ui_videosettings_mobile.py176
-rw-r--r--examples/multimedia/camera/videosettings.py9
-rw-r--r--examples/multimedia/camera/videosettings_mobile.ui207
7 files changed, 1193 insertions, 9 deletions
diff --git a/examples/multimedia/camera/camera.py b/examples/multimedia/camera/camera.py
index 95d33243e..c1ea92faa 100644
--- a/examples/multimedia/camera/camera.py
+++ b/examples/multimedia/camera/camera.py
@@ -10,12 +10,17 @@ from PySide6.QtMultimedia import (QAudioInput, QCamera, QCameraDevice,
QMediaRecorder)
from PySide6.QtWidgets import QDialog, QMainWindow, QMessageBox
from PySide6.QtGui import QAction, QActionGroup, QIcon, QImage, QPixmap
-from PySide6.QtCore import QDateTime, QDir, QTimer, Qt, Slot
+from PySide6.QtCore import QDateTime, QDir, QTimer, Qt, Slot, qWarning
-from ui_camera import Ui_Camera
from metadatadialog import MetaDataDialog
from imagesettings import ImageSettings
-from videosettings import VideoSettings
+from videosettings import VideoSettings, is_android
+
+if is_android:
+ from PySide6.QtCore import QCoreApplication, QMicrophonePermission, QCameraPermission
+ from ui_camera_mobile import Ui_Camera
+else:
+ from ui_camera import Ui_Camera
class Camera(QMainWindow):
@@ -23,13 +28,10 @@ class Camera(QMainWindow):
super().__init__()
self._video_devices_group = None
-
self.m_devices = QMediaDevices()
self.m_imageCapture = None
self.m_captureSession = QMediaCaptureSession()
self.m_camera = None
- self.m_audioInput = QAudioInput()
- self.m_captureSession.setAudioInput(self.m_audioInput)
self.m_mediaRecorder = None
self.m_isCapturingImage = False
@@ -42,7 +44,8 @@ class Camera(QMainWindow):
self._ui.setupUi(self)
image = Path(__file__).parent / "shutter.svg"
self._ui.takeImageButton.setIcon(QIcon(os.fspath(image)))
- self._ui.actionAbout_Qt.triggered.connect(qApp.aboutQt)
+ if not is_android:
+ self._ui.actionAbout_Qt.triggered.connect(qApp.aboutQt)
# disable all buttons by default
self.updateCameraActive(False)
@@ -53,6 +56,40 @@ class Camera(QMainWindow):
self._ui.metaDataButton.setEnabled(False)
# try to actually initialize camera & mic
+ self.initialize()
+
+ @Slot()
+ def initialize(self):
+ if is_android:
+ # camera
+ cam_permission = QCameraPermission()
+ cam_permission_status = qApp.checkPermission(cam_permission)
+ if cam_permission_status == Qt.PermissionStatus.Undetermined:
+ qApp.requestPermission(cam_permission, self, self.initialize)
+ return
+ if cam_permission_status == Qt.PermissionStatus.Denied:
+ qWarning("Camera permission is not granted!")
+ return
+ elif cam_permission_status == Qt.PermissionStatus.Granted:
+ print("[AudioSource] Camera permission granted")
+
+ # microphone
+ microphone_permission = QMicrophonePermission()
+ microphone_permission_status = qApp.checkPermission(microphone_permission)
+ if microphone_permission_status == Qt.PermissionStatus.Undetermined:
+ qApp.requestPermission(microphone_permission, self, self.initialize)
+ return
+ if microphone_permission_status == Qt.PermissionStatus.Denied:
+ qWarning("Microphone permission is not granted!")
+ self.initializeErrorWindow()
+ return
+ elif microphone_permission_status == Qt.PermissionStatus.Granted:
+ print("[AudioSource] Microphone permission granted")
+
+ self.m_audioInput = QAudioInput()
+ self.m_captureSession.setAudioInput(self.m_audioInput)
+
+ # Camera devices
self._video_devices_group = QActionGroup(self)
self._video_devices_group.setExclusive(True)
diff --git a/examples/multimedia/camera/camera.pyproject b/examples/multimedia/camera/camera.pyproject
index 9b4171d9a..9067b1dfa 100644
--- a/examples/multimedia/camera/camera.pyproject
+++ b/examples/multimedia/camera/camera.pyproject
@@ -2,9 +2,11 @@
"files": ["main.py",
"camera.py",
"camera.ui",
+ "camera_mobile.ui",
"imagesettings.py",
"imagesettings.ui",
"metadatadialog.py",
"videosettings.py",
- "videosettings.ui"]
+ "videosettings.ui",
+ "videosettings_mobile.ui"]
}
diff --git a/examples/multimedia/camera/camera_mobile.ui b/examples/multimedia/camera/camera_mobile.ui
new file mode 100644
index 000000000..7f269b17b
--- /dev/null
+++ b/examples/multimedia/camera/camera_mobile.ui
@@ -0,0 +1,504 @@
+<?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>429</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Camera</string>
+ </property>
+ <widget class="QWidget" name="centralwidget">
+ <layout class="QGridLayout" name="gridLayout_3">
+ <item row="1" column="1" colspan="2">
+ <widget class="QTabWidget" name="captureWidget">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <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="4" 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>
+ <item row="3" column="0">
+ <widget class="QLabel" name="label">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Exposure Compensation:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QPushButton" name="takeImageButton">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Capture Photo</string>
+ </property>
+ <property name="icon">
+ <iconset>
+ <normaloff>:/images/shutter.svg</normaloff>:/images/shutter.svg</iconset>
+ </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">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QPushButton" name="recordButton">
+ <property name="text">
+ <string>Record</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="pauseButton">
+ <property name="text">
+ <string>Pause</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="stopButton">
+ <property name="text">
+ <string>Stop</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>10</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="muteButton">
+ <property name="text">
+ <string>Mute</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="metaDataButton">
+ <property name="text">
+ <string>Set metadata</string>
+ </property>
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QStackedWidget" name="stackedWidget">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+ <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="QVideoWidget" name="viewfinder" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </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>
+ </layout>
+ </widget>
+ <widget class="QMenuBar" name="menubar">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>668</width>
+ <height>22</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>Close</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>Change Settings</string>
+ </property>
+ </action>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>QVideoWidget</class>
+ <extends>QWidget</extends>
+ <header>qvideowidget.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>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/multimedia/camera/ui_camera_mobile.py b/examples/multimedia/camera/ui_camera_mobile.py
new file mode 100644
index 000000000..9feab3d68
--- /dev/null
+++ b/examples/multimedia/camera/ui_camera_mobile.py
@@ -0,0 +1,251 @@
+# -*- coding: utf-8 -*-
+
+################################################################################
+## Form generated from reading UI file 'camera_mobile.ui'
+##
+## Created by: Qt User Interface Compiler version 6.5.2
+##
+## WARNING! All changes made in this file will be lost when recompiling UI file!
+################################################################################
+
+from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
+ QMetaObject, QObject, QPoint, QRect,
+ QSize, QTime, QUrl, Qt)
+from PySide6.QtGui import (QAction, QBrush, QColor, QConicalGradient,
+ QCursor, QFont, QFontDatabase, QGradient,
+ QIcon, QImage, QKeySequence, QLinearGradient,
+ QPainter, QPalette, QPixmap, QRadialGradient,
+ QTransform)
+from PySide6.QtMultimediaWidgets import QVideoWidget
+from PySide6.QtWidgets import (QApplication, QFrame, QGridLayout, QHBoxLayout,
+ QLabel, QMainWindow, QMenu, QMenuBar,
+ QPushButton, QSizePolicy, QSlider, QSpacerItem,
+ QStackedWidget, QStatusBar, QTabWidget, QVBoxLayout,
+ QWidget)
+
+class Ui_Camera(object):
+ def setupUi(self, Camera):
+ if not Camera.objectName():
+ Camera.setObjectName(u"Camera")
+ Camera.resize(668, 429)
+ self.actionExit = QAction(Camera)
+ self.actionExit.setObjectName(u"actionExit")
+ self.actionStartCamera = QAction(Camera)
+ self.actionStartCamera.setObjectName(u"actionStartCamera")
+ self.actionStopCamera = QAction(Camera)
+ self.actionStopCamera.setObjectName(u"actionStopCamera")
+ self.actionSettings = QAction(Camera)
+ self.actionSettings.setObjectName(u"actionSettings")
+ self.centralwidget = QWidget(Camera)
+ self.centralwidget.setObjectName(u"centralwidget")
+ self.gridLayout_3 = QGridLayout(self.centralwidget)
+ self.gridLayout_3.setObjectName(u"gridLayout_3")
+ self.captureWidget = QTabWidget(self.centralwidget)
+ self.captureWidget.setObjectName(u"captureWidget")
+ sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.captureWidget.sizePolicy().hasHeightForWidth())
+ self.captureWidget.setSizePolicy(sizePolicy)
+ self.tab_2 = QWidget()
+ self.tab_2.setObjectName(u"tab_2")
+ self.gridLayout = QGridLayout(self.tab_2)
+ self.gridLayout.setObjectName(u"gridLayout")
+ self.exposureCompensation = QSlider(self.tab_2)
+ self.exposureCompensation.setObjectName(u"exposureCompensation")
+ self.exposureCompensation.setMinimum(-4)
+ self.exposureCompensation.setMaximum(4)
+ self.exposureCompensation.setPageStep(2)
+ self.exposureCompensation.setOrientation(Qt.Horizontal)
+ self.exposureCompensation.setTickPosition(QSlider.TicksAbove)
+
+ self.gridLayout.addWidget(self.exposureCompensation, 4, 0, 1, 1)
+
+ self.label = QLabel(self.tab_2)
+ self.label.setObjectName(u"label")
+ sizePolicy1 = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)
+ sizePolicy1.setHorizontalStretch(0)
+ sizePolicy1.setVerticalStretch(0)
+ sizePolicy1.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
+ self.label.setSizePolicy(sizePolicy1)
+
+ self.gridLayout.addWidget(self.label, 3, 0, 1, 1)
+
+ self.takeImageButton = QPushButton(self.tab_2)
+ self.takeImageButton.setObjectName(u"takeImageButton")
+ self.takeImageButton.setEnabled(False)
+ icon = QIcon()
+ icon.addFile(u":/images/shutter.svg", QSize(), QIcon.Normal, QIcon.Off)
+ self.takeImageButton.setIcon(icon)
+
+ self.gridLayout.addWidget(self.takeImageButton, 0, 0, 1, 1)
+
+ self.captureWidget.addTab(self.tab_2, "")
+ self.tab = QWidget()
+ self.tab.setObjectName(u"tab")
+ self.gridLayout_2 = QGridLayout(self.tab)
+ self.gridLayout_2.setObjectName(u"gridLayout_2")
+ self.horizontalLayout = QHBoxLayout()
+ self.horizontalLayout.setObjectName(u"horizontalLayout")
+ self.verticalLayout = QVBoxLayout()
+ self.verticalLayout.setObjectName(u"verticalLayout")
+ self.recordButton = QPushButton(self.tab)
+ self.recordButton.setObjectName(u"recordButton")
+
+ self.verticalLayout.addWidget(self.recordButton)
+
+ self.pauseButton = QPushButton(self.tab)
+ self.pauseButton.setObjectName(u"pauseButton")
+
+ self.verticalLayout.addWidget(self.pauseButton)
+
+ self.stopButton = QPushButton(self.tab)
+ self.stopButton.setObjectName(u"stopButton")
+
+ self.verticalLayout.addWidget(self.stopButton)
+
+
+ self.horizontalLayout.addLayout(self.verticalLayout)
+
+ self.verticalLayout_2 = QVBoxLayout()
+ self.verticalLayout_2.setObjectName(u"verticalLayout_2")
+ self.verticalSpacer = QSpacerItem(20, 10, QSizePolicy.Minimum, QSizePolicy.Expanding)
+
+ self.verticalLayout_2.addItem(self.verticalSpacer)
+
+ self.muteButton = QPushButton(self.tab)
+ self.muteButton.setObjectName(u"muteButton")
+ self.muteButton.setCheckable(True)
+
+ self.verticalLayout_2.addWidget(self.muteButton)
+
+ self.metaDataButton = QPushButton(self.tab)
+ self.metaDataButton.setObjectName(u"metaDataButton")
+ self.metaDataButton.setCheckable(True)
+
+ self.verticalLayout_2.addWidget(self.metaDataButton)
+
+
+ self.horizontalLayout.addLayout(self.verticalLayout_2)
+
+
+ self.gridLayout_2.addLayout(self.horizontalLayout, 0, 0, 1, 1)
+
+ self.captureWidget.addTab(self.tab, "")
+
+ self.gridLayout_3.addWidget(self.captureWidget, 1, 1, 1, 2)
+
+ self.stackedWidget = QStackedWidget(self.centralwidget)
+ self.stackedWidget.setObjectName(u"stackedWidget")
+ sizePolicy2 = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
+ sizePolicy2.setHorizontalStretch(1)
+ sizePolicy2.setVerticalStretch(0)
+ sizePolicy2.setHeightForWidth(self.stackedWidget.sizePolicy().hasHeightForWidth())
+ self.stackedWidget.setSizePolicy(sizePolicy2)
+ palette = QPalette()
+ brush = QBrush(QColor(255, 255, 255, 255))
+ brush.setStyle(Qt.SolidPattern)
+ palette.setBrush(QPalette.Active, QPalette.Base, brush)
+ brush1 = QBrush(QColor(145, 145, 145, 255))
+ brush1.setStyle(Qt.SolidPattern)
+ palette.setBrush(QPalette.Active, QPalette.Window, brush1)
+ palette.setBrush(QPalette.Inactive, QPalette.Base, brush)
+ palette.setBrush(QPalette.Inactive, QPalette.Window, brush1)
+ palette.setBrush(QPalette.Disabled, QPalette.Base, brush1)
+ palette.setBrush(QPalette.Disabled, QPalette.Window, brush1)
+ self.stackedWidget.setPalette(palette)
+ self.viewfinderPage = QWidget()
+ self.viewfinderPage.setObjectName(u"viewfinderPage")
+ self.gridLayout_5 = QGridLayout(self.viewfinderPage)
+ self.gridLayout_5.setObjectName(u"gridLayout_5")
+ self.viewfinder = QVideoWidget(self.viewfinderPage)
+ self.viewfinder.setObjectName(u"viewfinder")
+ sizePolicy3 = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
+ sizePolicy3.setHorizontalStretch(0)
+ sizePolicy3.setVerticalStretch(0)
+ sizePolicy3.setHeightForWidth(self.viewfinder.sizePolicy().hasHeightForWidth())
+ self.viewfinder.setSizePolicy(sizePolicy3)
+
+ self.gridLayout_5.addWidget(self.viewfinder, 0, 0, 1, 1)
+
+ self.stackedWidget.addWidget(self.viewfinderPage)
+ self.previewPage = QWidget()
+ self.previewPage.setObjectName(u"previewPage")
+ self.gridLayout_4 = QGridLayout(self.previewPage)
+ self.gridLayout_4.setObjectName(u"gridLayout_4")
+ self.lastImagePreviewLabel = QLabel(self.previewPage)
+ self.lastImagePreviewLabel.setObjectName(u"lastImagePreviewLabel")
+ sizePolicy4 = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.MinimumExpanding)
+ sizePolicy4.setHorizontalStretch(0)
+ sizePolicy4.setVerticalStretch(0)
+ sizePolicy4.setHeightForWidth(self.lastImagePreviewLabel.sizePolicy().hasHeightForWidth())
+ self.lastImagePreviewLabel.setSizePolicy(sizePolicy4)
+ self.lastImagePreviewLabel.setFrameShape(QFrame.Box)
+
+ self.gridLayout_4.addWidget(self.lastImagePreviewLabel, 0, 0, 1, 1)
+
+ self.stackedWidget.addWidget(self.previewPage)
+
+ self.gridLayout_3.addWidget(self.stackedWidget, 0, 2, 1, 1)
+
+ Camera.setCentralWidget(self.centralwidget)
+ self.menubar = QMenuBar(Camera)
+ self.menubar.setObjectName(u"menubar")
+ self.menubar.setGeometry(QRect(0, 0, 668, 22))
+ self.menuFile = QMenu(self.menubar)
+ self.menuFile.setObjectName(u"menuFile")
+ self.menuDevices = QMenu(self.menubar)
+ self.menuDevices.setObjectName(u"menuDevices")
+ Camera.setMenuBar(self.menubar)
+ self.statusbar = QStatusBar(Camera)
+ self.statusbar.setObjectName(u"statusbar")
+ Camera.setStatusBar(self.statusbar)
+
+ self.menubar.addAction(self.menuFile.menuAction())
+ self.menubar.addAction(self.menuDevices.menuAction())
+ self.menuFile.addAction(self.actionStartCamera)
+ self.menuFile.addAction(self.actionStopCamera)
+ self.menuFile.addSeparator()
+ self.menuFile.addAction(self.actionSettings)
+ self.menuFile.addSeparator()
+ self.menuFile.addAction(self.actionExit)
+
+ self.retranslateUi(Camera)
+ self.recordButton.clicked.connect(Camera.record)
+ self.stopButton.clicked.connect(Camera.stop)
+ self.pauseButton.clicked.connect(Camera.pause)
+ self.actionExit.triggered.connect(Camera.close)
+ self.takeImageButton.clicked.connect(Camera.takeImage)
+ self.muteButton.toggled.connect(Camera.setMuted)
+ self.exposureCompensation.valueChanged.connect(Camera.setExposureCompensation)
+ self.actionSettings.triggered.connect(Camera.configureCaptureSettings)
+ self.actionStartCamera.triggered.connect(Camera.startCamera)
+ self.actionStopCamera.triggered.connect(Camera.stopCamera)
+
+ self.captureWidget.setCurrentIndex(0)
+ self.stackedWidget.setCurrentIndex(0)
+
+
+ QMetaObject.connectSlotsByName(Camera)
+ # setupUi
+
+ def retranslateUi(self, Camera):
+ Camera.setWindowTitle(QCoreApplication.translate("Camera", u"Camera", None))
+ self.actionExit.setText(QCoreApplication.translate("Camera", u"Close", None))
+ self.actionStartCamera.setText(QCoreApplication.translate("Camera", u"Start Camera", None))
+ self.actionStopCamera.setText(QCoreApplication.translate("Camera", u"Stop Camera", None))
+ self.actionSettings.setText(QCoreApplication.translate("Camera", u"Change Settings", None))
+ self.label.setText(QCoreApplication.translate("Camera", u"Exposure Compensation:", None))
+ self.takeImageButton.setText(QCoreApplication.translate("Camera", u"Capture Photo", None))
+ self.captureWidget.setTabText(self.captureWidget.indexOf(self.tab_2), QCoreApplication.translate("Camera", u"Image", None))
+ self.recordButton.setText(QCoreApplication.translate("Camera", u"Record", None))
+ self.pauseButton.setText(QCoreApplication.translate("Camera", u"Pause", None))
+ self.stopButton.setText(QCoreApplication.translate("Camera", u"Stop", None))
+ self.muteButton.setText(QCoreApplication.translate("Camera", u"Mute", None))
+ self.metaDataButton.setText(QCoreApplication.translate("Camera", u"Set metadata", None))
+ self.captureWidget.setTabText(self.captureWidget.indexOf(self.tab), QCoreApplication.translate("Camera", u"Video", None))
+ self.lastImagePreviewLabel.setText("")
+ self.menuFile.setTitle(QCoreApplication.translate("Camera", u"File", None))
+ self.menuDevices.setTitle(QCoreApplication.translate("Camera", u"Devices", None))
+ # retranslateUi
+
diff --git a/examples/multimedia/camera/ui_videosettings_mobile.py b/examples/multimedia/camera/ui_videosettings_mobile.py
new file mode 100644
index 000000000..85ec0820e
--- /dev/null
+++ b/examples/multimedia/camera/ui_videosettings_mobile.py
@@ -0,0 +1,176 @@
+# -*- coding: utf-8 -*-
+
+################################################################################
+## Form generated from reading UI file 'videosettings_mobile.ui'
+##
+## Created by: Qt User Interface Compiler version 6.5.2
+##
+## WARNING! All changes made in this file will be lost when recompiling UI file!
+################################################################################
+
+from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
+ QMetaObject, QObject, QPoint, QRect,
+ QSize, QTime, QUrl, Qt)
+from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
+ QFont, QFontDatabase, QGradient, QIcon,
+ QImage, QKeySequence, QLinearGradient, QPainter,
+ QPalette, QPixmap, QRadialGradient, QTransform)
+from PySide6.QtWidgets import (QAbstractButton, QApplication, QComboBox, QDialog,
+ QDialogButtonBox, QGridLayout, QGroupBox, QHBoxLayout,
+ QLabel, QSizePolicy, QSlider, QSpinBox,
+ QVBoxLayout, QWidget)
+
+class Ui_VideoSettingsUi(object):
+ def setupUi(self, VideoSettingsUi):
+ if not VideoSettingsUi.objectName():
+ VideoSettingsUi.setObjectName(u"VideoSettingsUi")
+ VideoSettingsUi.resize(329, 591)
+ self.gridLayout_3 = QGridLayout(VideoSettingsUi)
+ self.gridLayout_3.setObjectName(u"gridLayout_3")
+ self.widget = QWidget(VideoSettingsUi)
+ self.widget.setObjectName(u"widget")
+ sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.widget.sizePolicy().hasHeightForWidth())
+ self.widget.setSizePolicy(sizePolicy)
+ self.verticalLayout_3 = QVBoxLayout(self.widget)
+ self.verticalLayout_3.setObjectName(u"verticalLayout_3")
+ self.verticalLayout_3.setContentsMargins(0, 0, 0, 0)
+ self.groupBox_3 = QGroupBox(self.widget)
+ self.groupBox_3.setObjectName(u"groupBox_3")
+ self.verticalLayout_2 = QVBoxLayout(self.groupBox_3)
+ self.verticalLayout_2.setObjectName(u"verticalLayout_2")
+ self.label_2 = QLabel(self.groupBox_3)
+ self.label_2.setObjectName(u"label_2")
+
+ self.verticalLayout_2.addWidget(self.label_2)
+
+ self.audioCodecBox = QComboBox(self.groupBox_3)
+ self.audioCodecBox.setObjectName(u"audioCodecBox")
+
+ self.verticalLayout_2.addWidget(self.audioCodecBox)
+
+ self.label_5 = QLabel(self.groupBox_3)
+ self.label_5.setObjectName(u"label_5")
+
+ self.verticalLayout_2.addWidget(self.label_5)
+
+ self.audioSampleRateBox = QSpinBox(self.groupBox_3)
+ self.audioSampleRateBox.setObjectName(u"audioSampleRateBox")
+
+ self.verticalLayout_2.addWidget(self.audioSampleRateBox)
+
+
+ self.verticalLayout_3.addWidget(self.groupBox_3)
+
+ self.groupBox = QGroupBox(self.widget)
+ self.groupBox.setObjectName(u"groupBox")
+ self.verticalLayout = QVBoxLayout(self.groupBox)
+ self.verticalLayout.setObjectName(u"verticalLayout")
+ self.label_3 = QLabel(self.groupBox)
+ self.label_3.setObjectName(u"label_3")
+
+ self.verticalLayout.addWidget(self.label_3)
+
+ self.qualitySlider = QSlider(self.groupBox)
+ self.qualitySlider.setObjectName(u"qualitySlider")
+ self.qualitySlider.setMaximum(4)
+ self.qualitySlider.setOrientation(Qt.Horizontal)
+
+ self.verticalLayout.addWidget(self.qualitySlider)
+
+ self.label_4 = QLabel(self.groupBox)
+ self.label_4.setObjectName(u"label_4")
+
+ self.verticalLayout.addWidget(self.label_4)
+
+ self.containerFormatBox = QComboBox(self.groupBox)
+ self.containerFormatBox.setObjectName(u"containerFormatBox")
+
+ self.verticalLayout.addWidget(self.containerFormatBox)
+
+
+ self.verticalLayout_3.addWidget(self.groupBox)
+
+
+ self.gridLayout_3.addWidget(self.widget, 2, 0, 1, 1)
+
+ self.groupBox_2 = QGroupBox(VideoSettingsUi)
+ self.groupBox_2.setObjectName(u"groupBox_2")
+ self.gridLayout_2 = QGridLayout(self.groupBox_2)
+ self.gridLayout_2.setObjectName(u"gridLayout_2")
+ self.label = QLabel(self.groupBox_2)
+ self.label.setObjectName(u"label")
+
+ self.gridLayout_2.addWidget(self.label, 2, 0, 1, 1)
+
+ self.videoCodecBox = QComboBox(self.groupBox_2)
+ self.videoCodecBox.setObjectName(u"videoCodecBox")
+
+ self.gridLayout_2.addWidget(self.videoCodecBox, 6, 0, 1, 2)
+
+ self.label_8 = QLabel(self.groupBox_2)
+ self.label_8.setObjectName(u"label_8")
+
+ self.gridLayout_2.addWidget(self.label_8, 0, 0, 1, 2)
+
+ self.label_6 = QLabel(self.groupBox_2)
+ self.label_6.setObjectName(u"label_6")
+
+ self.gridLayout_2.addWidget(self.label_6, 5, 0, 1, 2)
+
+ self.videoFormatBox = QComboBox(self.groupBox_2)
+ self.videoFormatBox.setObjectName(u"videoFormatBox")
+
+ self.gridLayout_2.addWidget(self.videoFormatBox, 1, 0, 1, 2)
+
+ self.buttonBox = QDialogButtonBox(self.groupBox_2)
+ self.buttonBox.setObjectName(u"buttonBox")
+ self.buttonBox.setOrientation(Qt.Horizontal)
+ self.buttonBox.setStandardButtons(QDialogButtonBox.Cancel|QDialogButtonBox.Ok)
+
+ self.gridLayout_2.addWidget(self.buttonBox, 7, 0, 1, 1)
+
+ self.horizontalLayout = QHBoxLayout()
+ self.horizontalLayout.setObjectName(u"horizontalLayout")
+ self.fpsSpinBox = QSpinBox(self.groupBox_2)
+ self.fpsSpinBox.setObjectName(u"fpsSpinBox")
+ self.fpsSpinBox.setMinimum(8)
+ self.fpsSpinBox.setMaximum(30)
+
+ self.horizontalLayout.addWidget(self.fpsSpinBox)
+
+ self.fpsSlider = QSlider(self.groupBox_2)
+ self.fpsSlider.setObjectName(u"fpsSlider")
+ self.fpsSlider.setOrientation(Qt.Horizontal)
+
+ self.horizontalLayout.addWidget(self.fpsSlider)
+
+
+ self.gridLayout_2.addLayout(self.horizontalLayout, 3, 0, 1, 1)
+
+
+ self.gridLayout_3.addWidget(self.groupBox_2, 3, 0, 1, 1)
+
+
+ self.retranslateUi(VideoSettingsUi)
+ self.buttonBox.accepted.connect(VideoSettingsUi.accept)
+ self.buttonBox.rejected.connect(VideoSettingsUi.reject)
+
+ QMetaObject.connectSlotsByName(VideoSettingsUi)
+ # setupUi
+
+ def retranslateUi(self, VideoSettingsUi):
+ VideoSettingsUi.setWindowTitle(QCoreApplication.translate("VideoSettingsUi", u"Video Settings", None))
+ self.groupBox_3.setTitle(QCoreApplication.translate("VideoSettingsUi", u"Audio", None))
+ self.label_2.setText(QCoreApplication.translate("VideoSettingsUi", u"Audio Codec:", None))
+ self.label_5.setText(QCoreApplication.translate("VideoSettingsUi", u"Sample Rate:", None))
+ self.label_3.setText(QCoreApplication.translate("VideoSettingsUi", u"Quality:", None))
+ self.label_4.setText(QCoreApplication.translate("VideoSettingsUi", u"File Format:", None))
+ self.groupBox_2.setTitle(QCoreApplication.translate("VideoSettingsUi", u"Video", None))
+ self.label.setText(QCoreApplication.translate("VideoSettingsUi", u"Frames per second:", None))
+ self.label_8.setText(QCoreApplication.translate("VideoSettingsUi", u"Camera Format:", None))
+ self.label_6.setText(QCoreApplication.translate("VideoSettingsUi", u"Video Codec:", None))
+ # retranslateUi
+
diff --git a/examples/multimedia/camera/videosettings.py b/examples/multimedia/camera/videosettings.py
index 5aab973b6..2359bd55b 100644
--- a/examples/multimedia/camera/videosettings.py
+++ b/examples/multimedia/camera/videosettings.py
@@ -1,11 +1,18 @@
# Copyright (C) 2023 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+import os
from PySide6.QtMultimedia import (QCameraFormat, QMediaFormat, QMediaRecorder,
QVideoFrameFormat)
from PySide6.QtWidgets import QDialog
-from ui_videosettings import Ui_VideoSettingsUi
+is_android = os.environ.get('ANDROID_ARGUMENT')
+
+if is_android:
+ from ui_videosettings_mobile import Ui_VideoSettingsUi
+else:
+ from ui_videosettings import Ui_VideoSettingsUi
+
def box_value(box):
diff --git a/examples/multimedia/camera/videosettings_mobile.ui b/examples/multimedia/camera/videosettings_mobile.ui
new file mode 100644
index 000000000..6584f07f9
--- /dev/null
+++ b/examples/multimedia/camera/videosettings_mobile.ui
@@ -0,0 +1,207 @@
+<?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>329</width>
+ <height>591</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Video Settings</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_3">
+ <item row="2" column="0">
+ <widget class="QWidget" name="widget" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QGroupBox" name="groupBox_3">
+ <property name="title">
+ <string>Audio</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Audio Codec:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="audioCodecBox"/>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_5">
+ <property name="text">
+ <string>Sample Rate:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="audioSampleRateBox"/>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox">
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>Quality:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSlider" name="qualitySlider">
+ <property name="maximum">
+ <number>4</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_4">
+ <property name="text">
+ <string>File Format:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="containerFormatBox"/>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QGroupBox" name="groupBox_2">
+ <property name="title">
+ <string>Video</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="2" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Frames per second:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0" colspan="2">
+ <widget class="QComboBox" name="videoCodecBox"/>
+ </item>
+ <item row="0" column="0" colspan="2">
+ <widget class="QLabel" name="label_8">
+ <property name="text">
+ <string>Camera Format:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0" colspan="2">
+ <widget class="QLabel" name="label_6">
+ <property name="text">
+ <string>Video Codec:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2">
+ <widget class="QComboBox" name="videoFormatBox"/>
+ </item>
+ <item row="7" 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>
+ <item row="3" column="0">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QSpinBox" name="fpsSpinBox">
+ <property name="minimum">
+ <number>8</number>
+ </property>
+ <property name="maximum">
+ <number>30</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSlider" name="fpsSlider">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </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>