我有一些QPushButtons
可以在鼠标点击或按下键盘快捷键(单个字母键)时播放不同的.wav文件。
我想知道是否有办法识别按钮按特定顺序点击的时间,然后播放不同的声音?到目前为止我能够得到的最接近的是使用setShortcut来分配按下特定键序列时播放的声音,但这只能使用未指定为按钮快捷键的键。
我是Python(和PySide)的新手,所以我不确定这是否可能。
答案 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_())