VNPY 的EVENT事件作為 pyQT5的訊號觸發函式

張國平發表於2021-10-11

最近在做vnpy的一些介面修改,裡面很多要做內容就是按照Event事件,作為pyqt5訊號,來觸發訊號槽函式。


簡單介紹下pyqt5的訊號和訊號槽,訊號是就是QtCore.pyqtSignal類的實例項物件。訊號有個emit() 方法,當emit執行時候,相當於觸發訊號,啟用對應的訊號槽。訊號槽就是對應函式,將會被操作。介面按鈕點選或者螢幕雙擊,都是一些原生的訊號事件,直接呼叫就是可以,至於更多相關內容可以網上找找資料。


我們這裡說的是當VNPY的EVENT事件做為pyQT5訊號,觸發對應訊號槽函式。

比如一筆的成交,在vnpy中定義好一個成交事件

EVENT_CTA_TRADE = 'eCtaTrade'

此時,這裡在建立是對應的訊號例項,引數型別是Event。然後把這個訊號傳送函式和event繫結,程式碼如下

signal_trade_strategy = QtCore.pyqtSignal(Event)
event_engine.register(
    EVENT_CTA_TRADE, signal_trade_strategy.emit
)

這個時候需要定義對應的訊號槽,如果process_cta_trade_event是處理函式,定義如下

self.signal_trade_strategy.connect(process_cta_trade_event)


在處理函式中,Event 事件可以作為引數直接獲取。之後可以做為內容更新

process_cta_trade_event(, event):
    data = event.data

這裡沒有什麼難點,如果訊號槽事件不觸及pyqt5 的UI 繪製的化,其實直接在EVENT繫結時候直接繫結訊號槽函式。

但是如果訊號槽事件涉及到UI繪製的化,必須要用自定義pyqt5訊號,因為UI更新繪製是一個子執行緒,如果整個VNPY是作為子執行緒執行,比如用child模式,子執行緒定時觸發執行,那麼就會報錯下面錯誤。唯一要注意地方。

QObject::connect: Cannot queue arguments of type 'QVector<int>'
(Make sure 'QVector<int>' is registered using qRegisterMetaType().)




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-2795399/,如需轉載,請註明出處,否則將追究法律責任。

相關文章