3

我正在开发一个软件,它有一个虚拟钢琴,可以由一个 MIDI 键盘控制。我想要做的是我想要一个线程来观察midi输入,并且当有数据到来时应该触发相应的进程(这里播放声音并为键设置动画)。我如何使用 Qt 线程和事件来做到这一点?

4

2 回答 2

3

这是一个关于如何使用自定义信号的好页面:http ://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/new_style_signals_slots.html

这是一个展示如何使用 QThread 的页面:http: //joplaete.wordpress.com/2010/07/21/threading-with-pyqt4/

这几乎就是你所需要的。您使用 run() 函数创建 QThread,该函数将循环并监视您的 midi 端口,然后发出自定义信号。您将在应用程序启动时启动此线程。您可以将您创建的 QThread 自定义信号连接到主应用程序上的处理程序或任何应通知的小部件。

于 2012-03-23T19:49:13.417 回答
0

这里有一个小例子:

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_()
于 2012-03-23T20:02:20.683 回答