2012-03-23 48 views
2

我正在開發一個軟件,它有一個虛擬鋼琴,可以用MIDI鍵盤控制。我想要做的是我想要一個線程觀看midi輸入,當有數據傳入時,相應的過程應該被觸發(在這裏播放聲音和動畫鍵)。我如何用Qt線程和事件來做到這一點?PyQt中的線程化

+0

創建一個線程。發出一個信號。如果您需要更廣泛的答案,您需要更具體地瞭解您嘗試過的以及不起作用的東西,而不是要求提供如何使用QThreads和信號的完整通用示例。 – jdi 2012-03-23 19:01:52

+0

我有一些按鈕作爲我的鋼琴鍵。我已經完成了使用電腦鍵盤來播放這些鍵的程序。現在我必須用我的MIDI鍵盤來演奏。所以現在我通過按一個鍵完成它,程序將進入MIDI讀取循環,然後觸發相應的動作。但是這裏的其他Qt函數沒有被執行。所以我只是想實現一個單獨的事件,當midi端口中有數據時發出信號。我怎麼用PyQt做? – 2012-03-23 19:36:52

回答

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的自定義信號連接到你的主應用程序的處理程序或任何應該通知的窗口小部件。

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_() 
+0

這是舊式信號插槽。你應該嘗試更新這個更新的pythonic版本 – jdi 2012-03-23 20:24:40

+0

好吧,我明白了。感謝您的答案中的鏈接。 – Adam 2012-03-23 20:36:50

+0

終於搞定了:-)謝謝 – 2012-03-24 18:01:02