Неожиданное поведение QSound внутри объектов - PullRequest
1 голос
/ 23 апреля 2019

Во время тестирования QSound для одной из моих программ я столкнулся с проблемой, которую не могу понять.Всякий раз, когда я реализую объекты QSound внутри другого объекта, функция play () не может вызывать переменные-члены объекта QSound.

Вот примеры, которые я использовал для анализа проблемы:

  1. Пример с QSound в скрипте (работает как ожидается с 2 повторениями звука)
from PyQt5.Qt import QApplication
from PyQt5.QtMultimedia import QSound
import sys

app=QApplication(sys.argv)

SoundObject=QSound("./path/sound.wav")

SoundObject.play()
SoundObject.play("./path/sound.wav")

sys.exit(app.exec())
Пример QSound внутри другого объекта (только одно повторение звука)
from PyQt5.Qt import QApplication
from PyQt5.QtMultimedia import QSound
import sys

app=QApplication(sys.argv)

class SoundClass:

   def __init__(self):

        SoundObject = QSound("./path/sound.wav")

        print(SoundObject.fileName())  # output= "./path/sound.wav"

        SoundObject.play()  # this doesn't do anything
        SoundObject.play("./path/sound.wav") 

SoundClass()

sys.exit(app.exec())

В обоих случаях я ожидаю, что звук воспроизводится 2 раза подряд.Однако, как только я использую объект QSound внутри другого объекта, похоже, что функция .play () игнорирует настройки моего объекта и вместо этого вызывает статическую функцию QSound.play ().Такое же поведение проявляется и для других переменных-членов объекта QSound (например, setLoops / loops).

При поиске ответа на мою проблему я обнаружил поток, посвященный той же проблеме с C ++ и Qt.Хотя кто-то упомянул, что QSound может быть устаревшим, однозначного ответа не было.(И мне интересно, почему через 4 года это все еще будет частью документации.)

Ссылка на тему: Вызов QSound :: play ("soundpath") работает, но объект QSound не работает.'t

Я использовал следующую документацию: https://www.riverbankcomputing.com/static/Docs/PyQt5/api/qtmultimedia/qsound.html?highlight=qsound#PyQt5.QtMultimedia.QSound

Мои характеристики:

  • Windows 10.0.17134.706
  • Python 3.7
  • PyQt 5.12

Я что-то упустил или это просто ошибка?

1 Ответ

0 голосов
/ 23 апреля 2019

Во втором коде переменная SoundObject является локальной переменной, которая будет удалена, когда конструктор завершит выполнение, поэтому первое воспроизведение не будет выполнено вместо второго воспроизведения, если это статический метод, который не зависит от какого-либо объекта.

В первом коде переменная SoundObject будет удалена после завершения скрипта, поскольку его область действия больше.

Решение состоит в том, чтобы расширить область применения SoundObject, сделав его членом класса:

from PyQt5.Qt import QApplication
from PyQt5.QtMultimedia import QSound
import sys

app = QApplication(sys.argv)


class SoundClass:
    def __init__(self):
        self.SoundObject = QSound("./path/sound.wav")
        print(self.SoundObject.fileName())  # output= "./path/sound.wav"
        self.SoundObject.play()  # this doesn't do anything
        self.SoundObject.play("./path/sound.wav")


SoundClass()
sys.exit(app.exec())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...