vnpy源码阅读学习(7):串在一起

  • 2020 年 3 月 28 日
  • 筆記

串在一起

我们已经分析了UI、MainEngine、EventEngine。然后他们几个是如何发挥作用的呢?我总结了一张图:

串起来

我们来具体的看看UI部分是如何跟EventEngine穿插起来的

  1. examplesvn_traderrun.py
def main():      """"""      qapp = create_qapp()      event_engine = EventEngine()      main_engine = MainEngine(event_engine)      main_window = MainWindow(main_engine, event_engine)  
  1. vnpytraderuimainwindow.py
#在MainWindow中  def __init__(self, main_engine: MainEngine, event_engine: EventEngine):      self.main_engine = main_engine      self.event_engine = event_engine      self.init_ui()    def init_ui(self):      self.init_dock()    def init_dock(self):        self.trading_widget, trading_dock = self.create_dock(          TradingWidget, "交易", QtCore.Qt.LeftDockWidgetArea      )    def create_dock(          self, widget_class: QtWidgets.QWidget, name: str, area: int      ):        widget = widget_class(self.main_engine, self.event_engine)    

从上述代码中我们可以看到widget在实例化的时候,传入了main_engine和event_engine

  1. vnpytraderuiwidget.py
      signal_tick = QtCore.pyqtSignal(Event)      def __init__(self, main_engine: MainEngine, event_engine: EventEngine):            super(TradingWidget, self).__init__()            self.main_engine = main_engine          self.event_engine = event_engine            self.vt_symbol = ""            self.init_ui()          self.register_event()        def register_event(self):          self.signal_tick.connect(self.process_tick_event)          self.event_engine.register(EVENT_TICK, self.signal_tick.emit)      def process_tick_event(self, event: Event):          """"""          tick = event.data  

我们已经看到一个窗体把一个回调函数process_tick_event注册给了EventEngine利用事件和插槽把整个系统连接在了一起,妙哉!
有了大概的框架,我们似乎都可以设计一个不断触发Event,然后一个UI框架,可以有多个窗体不断的相应这些事件。而且这些事件可以传递给多个订阅者窗体,且是通过多线程在游走于多个窗体。