当前位置: 首页 > 知识库问答 >
问题:

PyQt中的QKeyPress事件

松旻
2023-03-14

我的软件有问题。在我的钢琴软件中,如果我一直按键盘上的一个键,那么它就会重复该键的多个相同音调。但实际上我需要一个单音,直到释放那把钥匙。我提供了检测按键事件并调用相应方法的部分代码。那么我的代码应该做些什么改变呢??

def keyPressEvent(self, event):
    if type(event) == QtGui.QKeyEvent and event.key() == QtCore.Qt.Key_A : 
        self.Playnote('/home/hemanth/hemanth/Piano/C.mp3')
        self.ui.pushButton.animateClick(100)
    if type(event) == QtGui.QKeyEvent and event.key() == QtCore.Qt.Key_S:
        self.Playnote('/home/hemanth/hemanth/Piano/D.mp3')
        self.ui.pushButton_2.animateClick(100)

共有2个答案

邹博明
2023-03-14

由于keyPressEvent始终会收到QKeyEvent,因此根本不需要检查其类型。你可以先简化这个例子:

def keyPressEvent(self, event):
    key = event.key()
    if key == QtCore.Qt.Key_A : 
        self.Playnote('/home/hemanth/hemanth/Piano/C.mp3')
        self.ui.pushButton.animateClick(100)
    elif key == QtCore.Qt.Key_S:
        self.Playnote('/home/hemanth/hemanth/Piano/D.mp3')
        self.ui.pushButton_2.animateClick(100)

现在,就像你说的,每次按下一个键都会发出声音。要获得所需的全部功能,需要几个步骤。

  1. Playnote需要能够保持循环,直到被告知停止
  2. 您需要保留对该Playnote对象的引用,以便稍后停止它
  3. keyReleaseEvent必须使用Playnote引用来停止它

如果你使用声子来实现这个Playnote的功能,那么你可以使用文档建议的方法。这将是将媒体对象的about to finish信号连接到一个方法,该方法将使同一媒体源的另一个版本排队。

它可能看起来像这样:

class Playnote(QtCore.QObject):

    def __init__(self, soundFile, parent=None):
        super(Playnote, self).__init__(parent)

        self._isStopped = True

        self.mediaSource = Phonon.MediaSource(soundFile)
        self.mediaObject = Phonon.MediaObject(self)
        self.audioOutput = Phonon.AudioOutput(Phonon.MusicCategory, self)
        Phonon.createPath(self.mediaObject, self.audioOutput)
        self.mediaObject.setCurrentSource(self.mediaSource)

        self.mediaObject.aboutToFinish.connect(self.doRequeue)


    def doRequeue(self):
        if not self._isStopped:
            self.mediaObject.enqueue(self.mediaSource)


    def play(self):
        self._isStopped = True
        # other code here

    def stop(self):
        self._isStopped = False
        # other code here

您正在将该信号连接到一种方法,如果播放机未停止,该方法将重新发出相同的声音。

当您使用按键事件启动声音时,您必须存储对正在播放的对象的引用。也许你可以创建一个字典,并存储一个键到当前播放对象的映射?

# in your class
self.keysPlaying = {}

def keyPressEvent(self, event):
    key = event.key()
    if key == QtCore.Qt.Key_A :
        c_note = Playnote('/home/hemanth/hemanth/Piano/C.mp3')
        self.keysPlaying['c'] = c_note

现在您已经启动并循环了声音,您可以在以后的keyReleaseEvent中使用引用来停止声音:

def keyReleaseEvent(self, event):
    key = event.key()
    if key == QtCore.Qt.Key_A :
        note = self.keysPlaying.get('c', None)
        if note:
            note.stop()
            self.keysPlaying['c'] = None
程磊
2023-03-14

你应该检查事件。isAutoRepeat()来确定事件是由键盘自动回复还是实际按键引起的。如果是自动回复,忽略该按钮。

 类似资料:
  • 本文向大家介绍事件处理示例-PyQt,包括了事件处理示例-PyQt的使用技巧和注意事项,需要的朋友参考一下 按钮接受您的命令 1.在Python Shell或CMD提示符下获取输出 之前,我们深入研究了源代码及其引人入胜的输出。让我在此程序的几个关键部分为您提供帮助: window()是此处的用户定义函数,我们在其中设计并绘制了布局框架。 我们在这里使用了一个使用QDialog()的对话框。您可以

  • 本文向大家介绍PyQt事件处理机制,包括了PyQt事件处理机制的使用技巧和注意事项,需要的朋友参考一下 事件 在控制台生成的应用程序中,指令/命令按顺序执行。但是基于GUI的应用程序是事件驱动的。这意味着函数/方法是为了响应某些事件而执行的。这些事件可能是用户生成的(单击按钮、选择项目、鼠标单击等);但有时系统也会生成一些事件(窗口管理器、Internet连接或计时器)。当我们执行exec()方法

  • 本文向大家介绍事件处理示例(2)-PyQt,包括了事件处理示例(2)-PyQt的使用技巧和注意事项,需要的朋友参考一下 让我们尝试一些更有趣的东西, 1)键盘产生的事件 在执行程序之前,让我们尝试了解代码的关键点。这将有助于我们了解事件,信号和时段的性质。让我们一一研究它们: 这里使用一个简单的窗口作为界面。 keyPressEvent(),这只是PyQt框架中的预定义函数;用于定义所生成按键事件

  • 问题内容: 我试图在PyQt中发出自定义事件。一个小部件将发出,另一个小部件将监听事件,但是两个小部件不需要关联。 在JavaScript中,我会这样做 编辑:我知道信号和插槽,但只知道如何在父级和子级之间使用它们。我如何在任意不相关的小部件之间使用这种机制(或其他机制)? 问题答案: 在PyQt中,以下说明: 等价的 以类似的方式: 等价的 但是最大的区别是“文档”对象的范围,因为连接是在全局元

  • 本文向大家介绍按钮功能和自定义事件– PyQt,包括了按钮功能和自定义事件– PyQt的使用技巧和注意事项,需要的朋友参考一下 首先,让我们创建一个主代码;然后,我们将对其进行修改。我在这里为您提供主代码。并且,所做的修改将带有其说明。让我们做一些编码: 源代码: 输出结果 此输出布局是使用主窗口小部件生成的。QtGui.QMainWindow。self.setWindowIcon(QtGui.Q

  • PyQt是Qt库的Python版本。PyQt3支持Qt1到Qt3。 PyQt4支持Qt4。它的首次发布也是在1998年,但是当时它叫 PyKDE,因为开始的时候SIP和PyQt没有分开。PyQt是用SIP写的。PyQt 提供 GPL版和商业版。 PyQt向Python程序员提供了使用完整Qt应用程序接口的方法。您几乎可以用Python做任何C++能做的事。 既 然是应用程序接口,用C++或是Pyt