如何识别按特定顺序点击的按钮?

时间:2014-11-28 15:01:26

标签: python qt events sequence pyside

我有一些QPushButtons可以在鼠标点击或按下键盘快捷键(单个字母键)时播放不同的.wav文件。

我想知道是否有办法识别按钮按特定顺序点击的时间,然后播放不同的声音?到目前为止我能够得到的最接近的是使用setShortcut来分配按下特定键序列时播放的声音,但这只能使用未指定为按钮快捷键的键。

我是Python(和PySide)的新手,所以我不确定这是否可能。

2 个答案:

答案 0 :(得分:0)

当且仅当一系列其他事件以正确的顺序触发时,才需要触发的事件。除了按键序列之外,我不知道Qt中的任何内置框架。所以你必须为自己建立这个。它不是那么困难,你可以听一下每个按钮,然后调用一个具有一定数量的方法(你感兴趣的事件序列中的位置)然后检查你在这个序列中的位置是严格的增加顺序(否则重新设定),如果你达到一定的时间,就可以开始自己的事件。

示例:

from functools import partial
from PySide import QtGui

class MyEvent():

    def __init__(self):
        self.last_level = 0
        self.top_level = 3

    def update(self, level):
        if level == self.last_level + 1:
            self.last_level += 1
            if level == self.top_level:
                print('beep')
                self.last_level = 0
        else:
            if level == 1:
                self.last_level = level
            else:
                self.last_level = 0

app = QtGui.QApplication([])

e = MyEvent()

w = QtGui.QWidget()
l = QtGui.QVBoxLayout(w)

b1 = QtGui.QPushButton('Button 1')
b1.clicked.connect(partial(e.update, 1))
l.addWidget(b1)


b2 = QtGui.QPushButton('Button 2')
b2.clicked.connect(partial(e.update, 3))
l.addWidget(b2)

b3 = QtGui.QPushButton('Button 3')
b3.clicked.connect(partial(e.update, 2))
l.addWidget(b3)

w.show()

app.exec_()

这打印"哔"如果按此顺序按下按钮1,3,2。

答案 1 :(得分:0)

将所有按钮放在button-group中,以便激活按钮发送可由中央信号处理程序记录的标识符。然后可以将标识符添加到一起以形成在声音文件字典中查找的序列。

这是一个简单的演示:

from PySide import QtCore, QtGui

class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        layout = QtGui.QGridLayout(self)
        self.buttonGroup = QtGui.QButtonGroup(self)
        for column in range(3):
            identifier = column + 1
            button = QtGui.QPushButton('&%d' % identifier, self)
            self.buttonGroup.addButton(button, identifier)
            layout.addWidget(button, 0, column)
        self.edit = QtGui.QLineEdit(self)
        self.edit.setReadOnly(True)
        layout.addWidget(self.edit, 1, 0, 1, 3)
        self.buttonGroup.buttonClicked[int].connect(self.handleButtons)
        self._sounds = {
            '123': 'moo.wav',  '132': 'bark.wav',
            '213': 'meow.wav', '231': 'baa.wav',
            '312': 'oink.wav', '321': 'quack.wav',
            }
        self._sequence = ''

    def handleButtons(self, identifier):
        self._sequence += str(identifier)
        if len(self._sequence) == 3:
            self.edit.setText(self._sounds.get(self._sequence, ''))
            self._sequence = ''

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.setGeometry(500, 300, 300, 100)
    window.show()
    sys.exit(app.exec_())