首页 > 解决方案 > 对象内 QSound 的意外行为

问题描述

在为我的一个程序测试 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())
  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 可能已被弃用,但并没有明确的答案。(我想知道为什么 4 年后它仍然是文档的一部分。)

链接到线程:QSound::play("soundpath") 调用有效,但 QSound 对象无效

我使用了以下文档:https ://www.riverbankcomputing.com/static/Docs/PyQt5/api/qtmultimedia/qsound.html?highlight=qsound#PyQt5.QtMultimedia.QSound

我的规格:

我是否遗漏了一些重要的东西,或者这只是一个错误?

标签: pythonpython-3.xaudiopyqtpyqt5

解决方案


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

推荐阅读