Python PyQt中的线程

Python PyQt中的线程,python,multithreading,pyqt,midi,piano,Python,Multithreading,Pyqt,Midi,Piano,我正在开发一个软件,它有一个虚拟钢琴,可以由midi键盘控制。我想做的是,当有数据到来时,我想要一个线程来观察midi输入ans,相应的进程应该被触发(这里播放声音并设置关键帧的动画)。如何使用Qt线程和事件执行此操作?这是一个关于如何使用自定义信号的好页面: 旧式: 新样式: 下面是一个页面,展示了如何使用QThread: 这就是你所需要的。使用run()函数创建QThread,该函数将循环并监视midi端口,然后发出自定义信号。您将在应用程序启动时启动此线程。您可以将创建的QThr

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

这是一个关于如何使用自定义信号的好页面:

  • 旧式:
  • 新样式:
下面是一个页面,展示了如何使用QThread:


这就是你所需要的。使用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_()

创建一个线程。发出信号。如果你需要一个更广泛的答案,你需要更具体地说明你尝试了什么和什么不起作用,而不是要求提供一个关于如何使用QThreads和signals的完整的通用示例。我有一些按钮作为钢琴键。我已经做了一个电脑键盘用来播放这些键的程序。现在我要用我的midi键盘来演奏。现在我按下一个键,程序将进入midi读取循环,然后触发相应的动作。但在这里,程序的其他Qt函数无法执行。所以我只想实现一个单独的事件,当midi端口中有数据时,它会发出信号。我如何使用PyQt?这是老式的信号插槽。我明白了,你应该试着把它更新到新的更具Python风格的版本。谢谢你回答中的链接。