对象内部QSound的异常行为

时间:2019-04-22 21:46:04

标签: python python-3.x audio pyqt pyqt5

在为我的一个程序测试QSound时,遇到了一个无法解决的问题。每当我在另一个对象中实现QSound对象时,play()函数似乎都无法调用QSound对象的成员变量。

以下是示例,我用来分析问题:

  1. 在脚本中使用QSound的示例(按两次声音的预期效果工作)
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())
  1. 示例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可能已被弃用,但没有明确的答案。 (我想知道为什么四年后它仍会成为文档的一部分。)

链接到线程:QSound::play("soundpath") call works but a QSound object doesn'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 :(得分:0)

在第二个代码中,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())