我正在开发一个软件,该软件有一架虚拟钢琴,可以由midi键盘控制。我想做的是,我想要一个线程来观察midi输入,当有数据到来时,应该触发相应的进程(这里播放声音并设置键的动画)。如何使用Qt线程和事件?
这里有一个关于如何使用自定义信号的好页面:http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/new_style_signals_slots.html
- 旧式:http://pyqt.sourceforge.net/Docs/PyQt4/old_style_signals_slots.html
- 新样式:http://pyqt.sourceforge.net/Docs/PyQt4/new_style_signals_slots.html
下面是一个展示如何使用QThread的页面:http://joplaete.wordpress.com/2010/07/21/threading-with-pyqt4/
这几乎就是你所需要的。使用run()函数创建QThread,该函数将循环并监视midi端口,然后发出自定义信号。您将在启动应用程序时启动此线程。您可以将您创建的QThread的自定义信号连接到主应用程序或任何应该通知的小部件上的处理程序。
这里有一个小例子:
import time
import sys
from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import SIGNAL, QObject
class DoSomething(QtCore.QThread):
def __init__(self):
QtCore.QThread.__init__(self)
def run(self):
time.sleep(3)
self.emit(SIGNAL('some_signal'))
def signalHandler():
# We got signal!
print 'Got signal!'
sys.exit(0)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
# Create new thread object.
d = DoSomething()
# Connect signalHandler function with some_signal which
# will be emited by d thread object.
QObject.connect(d, SIGNAL('some_signal'), signalHandler, QtCore.Qt.QueuedConnection)
# Start new thread.
d.start()
app.exec_()