ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 05.12.2023
Просмотров: 884
Скачиваний: 3
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
Глава 28. Мультимедиа
693
•
ConstantBitRateEncoding
—
1
— режим кодирования с постоянным битрейтом. Бит- рейт устанавливается вызовом метода setBitRate()
, а значение качества соответст- венно выбирается самой PyQt;
•
AverageBitRateEncoding
—
2
— режим кодирования с переменным битрейтом. В этом случае метод setBitRate()
задает величину среднего битрейта;
•
TwoPassEncoding
—
3
— режим кодирования в два прохода;
setBitRate(<Битрейт>)
— задает битрейт кодирования звука, выраженный в битах в се- кунду. Его имеет смысл указывать только в том случае, если задан режим кодирования с по- стоянным битрейтом (атрибут
ConstantBitRateEncoding
), с переменным битрейтом (ат- рибут
AverageBitRateEncoding
) или кодирование в два прохода (атрибут
TwoPassEncoding
);
setQuality(<Качество кодирования>)
— задает качество кодирования звука. В качестве параметра указывается значение одного из следующих атрибутов класса
QMultimedia
:
•
VeryLowQuality
—
0
— самое низкое качество;
•
LowQuality
—
1
— низкое качество;
•
NormalQuality
—
2
— нормальное качество;
•
HighQuality
—
3
— высокое качество;
•
VeryHighQuality
—
4
— наивысшее качество.
Качество кодирования имеет смысл указывать только в том случае, если задан режим кодирования с постоянным качеством (атрибут
ConstantQualityEncoding
);
setEncodingOption(<Параметр>, <Значение>)
— задает значение для указанного пара- метра кодирования. Наименование параметра кодирования задается в виде строки;
setEncodingOptions(<Словарь>)
— задает сразу несколько параметров кодирования зву- ка. В параметре передается словарь, ключи которого представляют собой наименования параметров кодирования, а их значения — значения соответствующих параметров.
Набор поддерживаемых параметров кодирования зависит от выбранного звукового ко- дека.
Для примера напишем простую утилиту (листинг 28.5), осуществляющую запись звука с микрофона в минимальном качестве, — своего рода программный диктофон (рис. 28.4).
Листинг 28.5. Утилита для записи звука с микрофона from PyQt5 import QtCore, QtWidgets, QtMultimedia import sys, os class MyWindow(QtWidgets.QWidget): def __init__(self, parent = None):
QtWidgets.QWidget.__init__(self, parent, flags=QtCore.Qt.Window |
QtCore.Qt.MSWindowsFixedSizeDialogHint) self.setWindowTitle("Запись звука")
# Инициализируем подсистему для записи звука self.ardRecorder = QtMultimedia.QAudioRecorder()
# Устанавливаем максимальную громкость self.ardRecorder.setVolume(100)
694
Часть II. Библиотека PyQt 5
# Звук будет сохраняться в файле record.wav, находящемся
# в той же папке, где хранится программа fn = QtCore.QUrl.fromLocalFile(os.path.abspath("record.wav")) self.ardRecorder.setOutputLocation(fn)
# Устанавливаем звуковой вход по умолчанию self.ardRecorder.setAudioInput(self.ardRecorder.defaultAudioInput())
# Указываем формат файла WAV self.ardRecorder.setContainerFormat("audio/x-wav")
# Задаем параметры кодирования звука aes = QtMultimedia.QAudioEncoderSettings() aes.setCodec("audio/pcm") aes.setSampleRate(8000) aes.setChannelCount(1) aes.setEncodingMode
(QtMultimedia.QMultimedia.ConstantQualityEncoding) aes.setQuality(QtMultimedia.QMultimedia.VeryLowQuality) self.ardRecorder.setAudioSettings(aes) self.ardRecorder.statusChanged.connect(self.initRecorder) self.ardRecorder.durationChanged.connect(self.showDuration)
# Создаем компоненты для запуска, приостановки и остановки
# записи звука и регулирования его уровня vbox = QtWidgets.QVBoxLayout() hbox = QtWidgets.QHBoxLayout() self.btnRecord = QtWidgets.QPushButton("&Запись") self.btnRecord.clicked.connect(self.ardRecorder.record) hbox.addWidget(self.btnRecord) self.btnPause = QtWidgets.QPushButton("П&ауза") self.btnPause.clicked.connect(self.ardRecorder.pause) self.btnPause.setEnabled(False) hbox.addWidget(self.btnPause) self.btnStop = QtWidgets.QPushButton("&Стоп") self.btnStop.clicked.connect(self.ardRecorder.stop) self.btnStop.setEnabled(False) hbox.addWidget(self.btnStop) vbox.addLayout(hbox) hbox = QtWidgets.QHBoxLayout() lblVolume = QtWidgets.QLabel("&Уровень записи") hbox.addWidget(lblVolume) sldVolume = QtWidgets.QSlider(QtCore.Qt.Horizontal) sldVolume.setRange(0, 100) sldVolume.setTickPosition(QtWidgets.QSlider.TicksAbove) sldVolume.setTickInterval(10) sldVolume.setValue(100) lblVolume.setBuddy(sldVolume) sldVolume.valueChanged.connect(self.ardRecorder.setVolume) hbox.addWidget(sldVolume) vbox.addLayout(hbox)
# Создаем надпись, в которую будет выводиться состояние программы self.lblStatus = QtWidgets.QLabel("Готово") vbox.addWidget(self.lblStatus)
Глава 28. Мультимедиа
695 self.setLayout(vbox) self.resize(300, 100)
# В зависимости от состояния записи звука делаем нужные
# кнопки доступными или, напротив, недоступными и выводим
# соответствующий текст в надписи def initRecorder(self, status): if status == QtMultimedia.QMediaRecorder.RecordingStatus: self.btnRecord.setEnabled(False) self.btnPause.setEnabled(True) self.btnStop.setEnabled(True) self.lblStatus.setText("Запись") elif status == QtMultimedia.QMediaRecorder.PausedStatus: self.btnRecord.setEnabled(True) self.btnPause.setEnabled(False) self.lblStatus.setText("Пауза") elif status == QtMultimedia.QMediaRecorder.FinalizingStatus: self.btnRecord.setEnabled(True) self.btnPause.setEnabled(False) self.btnStop.setEnabled(False) self.lblStatus.setText("Готово")
# Выводим продолжительность записанного звука def showDuration(self, duration): self.lblStatus.setText("Записано " + str(duration // 1000) +
" секунд") app = QtWidgets.QApplication(sys.argv) window = MyWindow() window.show() sys.exit(app.exec_())
Рис. 28.4. Утилита для записи звука
28.5. Класс QSoundEffect
Класс
QSoundEffect предоставляет средства воспроизведения коротких звуковых файлов, что может пригодиться, скажем, для информирования пользователя о каком-либо событии.
Конструктор этого класса имеет следующий формат вызова:
<Объект> = QSoundEffect([parent=None])
В параметре parent может быть указана ссылка на родительский компонент.
696
Часть II. Библиотека PyQt 5
Класс
QSoundEffect поддерживает следующие основные методы (полный их список можно найти на странице https://doc.qt.io/qt-5/qsoundeffect.html):
setSource(
— задает файл-источник воспроизводимого звука в виде экземпляра класса
QUrl
;
setVolume(<Громкость>)
— задает громкость воспроизводимого звука в виде веществен- ного числа от
0.0
(звук отключен) до
1.0
(максимальная громкость);
setLoopCount(<Количество повторений>)
— задает количество повторений звука при воспроизведении. Значение
0
или
1
предписывает воспроизвести звук всего один раз, а значение атрибута
Infinite класса
QSoundEffect или
-2
— воспроизводить его снова и снова бесконечное количество раз;
setCategory(<Категория>)
— задает наименование категории (указывается в виде стро- ки), к которой относится воспроизводимый звук;
setMuted(<Флаг>)
— если передать значение
True
, звук при воспроизведении будет от- ключен. Значение
False вновь включает звук;
play()
— запускает воспроизведение звука. Метод является слотом;
stop()
— останавливает воспроизведение звука. Метод является слотом;
isLoaded()
— возвращает
True
, если звук загружен из указанного в методе setSource()
файла, и
False
— в противном случае;
isPlaying()
— возвращает
True
, если звук в текущий момент воспроизводится, и
False
— в противном случае;
loopsRemaining()
— возвращает количество оставшихся повторов воспроизведения зву- ка или значение атрибута
Infinite класса
QSoundEffect
, если было задано бесконечное воспроизведение;
volume()
— возвращает текущее значение громкости звука в виде вещественного числа от 0.0 до 1.0;
loopCount()
— возвращает количество повторений звука, заданное вызовом метода setLoopCount()
;
isMuted()
— возвращает
True
, если воспроизводящийся звук в текущий момент отклю- чен, и
False
— в противном случае;
status()
— возвращает текущее состояние звука в виде значения одного из следующих атрибутов класса
QSoundEffect
:
•
Null
—
0
— источник звука не задан;
•
Loading
—
1
— идет загрузка звука из файла-источника;
•
Ready
—
2
— звук загружен и готов к воспроизведению;
•
Error
—
3
— в процессе загрузки звука возникла ошибка;
supportedMimeTypes()
— возвращает список наименований поддерживаемых форматов звука в виде строк: for f in QtMultimedia.QSoundEffect.supportedMimeTypes(): print(f, end = " ")
Выведет: audio/x-wav audio/wav audio/wave audio/x-pn-wav
Метод является статическим.
Глава 28. Мультимедиа
697
Как видим, поддерживается лишь формат WAV в виде четырех различных MIME-типов.
Что касается аудиокодеков, то, по результатам экспериментов авторов, поддерживается лишь кодек PCM.
Класс
QSoundEffect поддерживает следующие наиболее полезные для нас сигналы (полный их список можно найти на странице https://doc.qt.io/qt-5/qsoundeffect.html):
statusChanged()
— генерируется при изменении состояния звука;
loadedChanged()
— генерируется при изменении состояния загрузки звука из файла- источника;
playingChanged()
— генерируется при изменении состояния воспроизведения звука;
loopsRemainingChanged()
— генерируется при каждом повторении воспроизводимого звука;
volumeChanged()
— генерируется при изменении громкости звука;
mutedChanged()
— генерируется при отключении звука или, наоборот, восстановлении его громкости через вызов метода setMuted()
Примером к этому разделу станет небольшая программа, воспроизводящая звук, в зависи- мости от выбора пользователя: единожды, десять раз или бесконечно (листинг 28.6).
Листинг 28.6. Воспроизведение звуковых эффектов from PyQt5 import QtCore, QtWidgets, QtMultimedia import sys, os class MyWindow(QtWidgets.QWidget): def __init__(self, parent = None):
QtWidgets.QWidget.__init__(self, parent, flags=QtCore.Qt.Window |
QtCore.Qt.MSWindowsFixedSizeDialogHint) self.setWindowTitle("Звуковые эффекты")
# Инициализируем подсистему вывода звуковых эффектов self.sndEffect = QtMultimedia.QSoundEffect() self.sndEffect.setVolume(1)
# Задаем файл-источник fn = QtCore.QUrl.fromLocalFile(os.path.abspath("effect.wav")) self.sndEffect.setSource(fn) self.sndEffect.loopsRemainingChanged.connect(self.showCount) self.sndEffect.playingChanged.connect(self.clearCount) vbox = QtWidgets.QVBoxLayout()
# Создаем кнопки для запуска воспроизведения звука lblPlay = QtWidgets.QLabel("Воспроизвести...") vbox.addWidget(lblPlay) btnOnce = QtWidgets.QPushButton("...&один раз") btnOnce.clicked.connect(self.playOnce) vbox.addWidget(btnOnce) btnTen = QtWidgets.QPushButton("...&десять раз") btnTen.clicked.connect(self.playTen) vbox.addWidget(btnTen) btnInfinite = QtWidgets.QPushButton(
"...&бесконечное количество раз")
698
Часть II. Библиотека PyQt 5 btnInfinite.clicked.connect(self.playInfinite) vbox.addWidget(btnInfinite) btnStop = QtWidgets.QPushButton("&Стоп") btnStop.clicked.connect(self.sndEffect.stop) vbox.addWidget(btnStop) self.lblStatus = QtWidgets.QLabel("") vbox.addWidget(self.lblStatus) self.setLayout(vbox) self.resize(200, 100) def playOnce(self): self.sndEffect.setLoopCount(1) self.sndEffect.play() def playTen(self): self.sndEffect.setLoopCount(10) self.sndEffect.play() def playInfinite(self): self.sndEffect.setLoopCount(QtMultimedia.QSoundEffect.Infinite) self.sndEffect.play()
# Выводим количество повторений воспроизведения эффекта def showCount(self): self.lblStatus.setText("Воспроизведено " + str(self.sndEffect.loopCount() - self.sndEffect.loopsRemaining()) + " раз")
# Если воспроизведение закончено, очищаем выведенное ранее
# количество повторений эффекта def clearCount(self): if not self.sndEffect.isPlaying(): self.lblStatus.setText("") app = QtWidgets.QApplication(sys.argv) window = MyWindow() window.show() sys.exit(app.exec_())
П
РИМЕЧАНИЕ
Помимо описанных здесь возможностей, PyQt 5 поддерживает доступ к устройствам вос- произведения звука на низком уровне, а также получение непосредственно массива звуко- вых и видеоданных с целью их анализа и обработки. Соответствующие программные инст- рументы описаны в документации по этой библиотеке.
1 ... 62 63 64 65 66 67 68 69 ... 83
ГЛ А В А
29
Печать документов
PyQt 5 поддерживает ряд развитых средств, позволяющих выполнить печать документов, их предварительный просмотр и экспорт в формат PDF.
Любой установленный в системе принтер представляется классом
QPrinter
. Поскольку он является подклассом класса
QPagedPaintDevice
, который, в свою очередь, наследует рас- смотренный в главе 24 класс
QPaintDevice
, мы можем для вывода документов на печать использовать методы последнего.
Класс
QPrintDialog обеспечивает функциональность диалогового окна выбора принтера, а класс
QPageSetupDialog
— диалогового окна установки параметров страницы. Для предва- рительного просмотра печатаемых документов задействуются классы
QPrintPreviewDialog и
QPrintPreviewWidget
: первый выводит документ в отдельное диалоговое окно, а второй — в специализированный компонент, который мы можем использовать вместе с любыми дру- гими изученными нами компонентами. Класс
QPrinterInfo позволяет выяснить, какие принтеры имеются в наличии, и узнать параметры любого из установленных принтеров.
PyQt 5 поддерживает и экспорт документов в формат Adobe PDF исключительно встроен- ными средствами, без привлечения каких бы то ни было сторонних программ. Для выпол- нения этой задачи служит класс
QPdfWriter
Все описанные в этой главе классы определены в модуле
QtPrintSupport
, если не указано иное.
29.1. Основные средства печати
Вывести документ на принтер в PyQt довольно просто. Почти все, что нам нужно для этого знать, было описано в главе 24.
29.1.1. Класс QPrinter
Как уже говорилось, класс
QPrinter представляет установленный в системе принтер. Его иерархия наследования такова:
QPaintDevice – QPagedPaintDevice – QPrinter
Конструктор класса
QPrinter имеет следующие форматы вызова:
<Объект> = QPrinter([mode=ScreenResolution])
<Объект> = QPrinter(
700
Часть II. Библиотека PyQt 5
Первый формат выбирает для печати принтер по умолчанию. В параметре mode может быть указано разрешение принтера, заданное в виде значения одного из следующих атрибутов класса
QPrinter
:
ScreenResolution
—
0
— разрешение экрана. Позволяет вывести документ максимально быстро, но в худшем качестве;
HighResolution
—
2
— разрешение принтера. Печать выполняется качественнее, но мед- леннее.
Второй формат позволяет выбрать произвольный принтер из числа установленных в систе- ме. Этот принтер задается экземпляром класса
QPrinterInfo
, речь о котором пойдет далее.
Класс
QPrinter поддерживает очень много методов, из которых мы рассмотрим лишь наи- более полезные (полный их список можно найти на странице https://doc.qt.io/qt-5/ qprinter.html
).
setPrinterName(<Имя принтера>)
— выполняет подключение к принтеру с заданным в виде строки именем. Если передать пустую строку, будет выполнено подключение к встроенной в PyQt подсистеме вывода документов в формате PDF;
printerName()
— возвращает строку с именем принтера, к которому выполнено подклю- чение;
setOutputFileName(<Путь к файлу>)
— задает путь к файлу, в который будет выведен печатаемый документ (так называемая печать в файл). Если файл имеет расширение pdf
, будет выполнен вывод в формате PDF. В противном случае файл будет сохранен в фор- мате, установленном в вызове метода setOutputFormat()
. Чтобы отключить вывод доку- мента в файл, следует вызвать этот метод, передав ему в качестве параметра пустую строку;
outputFileName()
— возвращает путь к файлу, в который будет выведен документ вме- сто печати на бумаге;
setOutputFormat(<Формат вывода>)
— задает формат вывода документа при печати в файл. В качестве параметра передается значение одного из следующих атрибутов класса
QPrinter
:
•
NativeFormat
—
0
— будет выполнен вывод во внутреннем формате принтера. Этот режим автоматически устанавливается при создании экземпляра класса
QPrinter и вызове метода setPrinterName()
с указанием имени существующего принтера. Если экземпляр класса подключен к подсистеме вывода в формате PDF, будет выполнено переподключение к принтеру по умолчанию;
•
PdfFormat
—
1
— будет выполнен вывод в формате PDF. Этот режим автоматически устанавливается при вызове метода setPrinterName()
с указанием пустой строки;
outputFormat()
— возвращает обозначение формата вывода документа;
isValid()
— возвращает
True
, если принтер действительно установлен в системе и готов к работе, и
False
— в противном случае.
setPageSize(
— задает размер страницы в виде экземпляра класса
QPageSize из модуля
QtGui
. Возвращает
True
, если операция увенчалась успехом, и
False
— в противном случае. Вот пример задания размера бумаги А4: ps = QtGui.QPageSize(QtGui.QPageSize.A4) printer.setPageSize(ps)
Глава 29. Печать документов
701
setPageOrientation(<Ориентация>)
— задает ориентацию страницы в виде значения ат- рибута
Portrait
(
0
, портретная) или
Landscape
(
1
, ландшафтная) класса
QPageLayout из модуля
QtGui
. Возвращает
True
, если операция увенчалась успехом, и
False
— в против- ном случае;
setPageMargins(<Слева>, <Сверху>, <Справа>, <Снизу>, <Единица измерения>)
— зада- ет отступы от краев страницы, соответственно, слева, сверху, справа и снизу в заданной единице измерения. Сами отступы указываются в виде вещественных чисел, а единица измерения — в виде значения одного из следующих атрибутов класса
QPageLayout
:
•
Millimeter
—
0
— миллиметры;
•
Point
—
1
— пункты;
•
Inch
—
2
— дюймы;
•
Pica
—
3
— пики;
•
Didot
—
4
— дидо (0,375 мм);
•
Cicero
—
5
— цицеро (4,5 мм).
Возвращает
True
, если операция увенчалась успехом, и
False
— в противном случае.
Вот пример задания отступов в 5 мм со всех сторон страницы: printer.setPageMargins(5, 5, 5, 5, QtGui.QPageLayout.Millimeter)
setPageLayout(
— задает сразу все параметры страницы (размеры, ори- ентацию и отступы от краев страницы в виде экземпляра класса
QPageLayout
. Возвраща- ет
True
, если операция увенчалась успехом, и
False
— в противном случае;
pageLayout()
— возвращает экземпляр класса
QPageLayout
, хранящий сведения о разме- ре бумаги, ориентации страницы и величинах отступов от краев страницы;
setCopyCount(<Количество копий>)
— задает количество копий печатаемого документа;
copyCount()
— возвращает количество копий печатаемого документа;
setCollateCopies(<Флаг>)
— если передано значение
True
, каждая копия документа бу- дет отпечатана полностью, прежде чем начнется печать следующей копии. Если пере- дать значение
False
, сначала будут отпечатаны все копии первой страницы, потом все копии второй и т. д.;
collateCopies()
— возвращает
True
, если каждая копия документа печатается пол- ностью, и
False
— в противном случае;
setDuplex(<Режим двухсторонней печати>)
— задает режим двусторонней печати в виде значения одного из следующих атрибутов класса
QPrinter
:
•
DuplexNone
—
0
— односторонняя печать;
•
DuplexAuto
—
1
— двусторонняя печать с автоматическим определением стороны листа, вокруг которой следует его перевернуть;
•
DuplexLongSide
—
2
— двусторонняя печать с переворачиванием листа вокруг длин- ной стороны;
•
DuplexShortSide
—
3
— двусторонняя печать с переворачиванием листа вокруг ко- роткой стороны;
duplex()
— возвращает обозначение заданного для принтера режима двусторонней печати;