1. 程式人生 > >VNPY_應用模組開發GUI介面

VNPY_應用模組開發GUI介面

作者:昊

目錄

VnTrader的GUI設計

GUI介面可以直觀的顯示策略、行情、賬戶和交易的相關資訊。VnTrader的介面是基於PyQt開發的,主視窗主要包含賬戶相關視窗、行情視窗、交易視窗和錯誤及日誌視窗等。PyQt包裝了QT的C++介面,所以關於視窗的官方手冊,可以參考Qt Documentation。VnTrader的視窗控制元件主要包含在檔案uiBasicWidget.py。下面就VnTrader用到的主要視窗控制元件做逐一介紹。

表格控制元件(TableWidget)

表格是VnTrader裡主要的視窗控制元件,可以清楚的顯示二維關係。表格主要由表頭和表項(表格單元)組成,表頭又分為行表頭和列表頭。VnTrader裡沒有使用列表頭。

VnTrader裡表格的類關係圖

Markdown

主視窗

子視窗的標題對應於表格類關係圖裡的類 Markdown

BasicMonitor

BasicMonitor類繼承自QtGui.QTableWidget,是所有VnTrader表格類的基類。它主要提供了表頭設定,不同表格單元的類設定,表格單元的資料更新和儲存表格到CSV檔案等等,並且可以監控事件和響應事件處理。下面就BasicMonitor類提供的主要介面做逐一介紹。

  • setHeaderDict

    • 設定行表頭字典。表格的表頭會根據這個字典,設定對應的表頭顯示和表格單元的類。如果對應的列有資料時,則根據'cellType'裡的表格單元類建立例項並顯示。
    • 引數 型別 說明
      headerDict dict headerDict的每個字典項形如headerDict['表格單元鍵值'] = {'chinese':u'表頭單元名', 'cellType':BasicCell}
      返回值:None
  • setDataKey

    • 設定表格的資料字典的鍵值,即每一行資料的鍵值,也就是說表格的行資料由此鍵值的內容來標識。這樣可以對已存在的行資料進行更新。比如對於行情表格,設定DataKey是'vtSymbol'。這樣用每個合約的vtSymbol來標識一行資料。這個合約的行情資料更新時,找到對應的行資料的每個表格單元,進行相應的更新。
    • 引數 型別 說明
      dataKey string 資料字典的鍵
      返回值:None
  • setEventType

    • 設定監控的事件型別
    • 引數 型別 說明
      eventType string 監控的事件型別
      返回值:None
  • setFont

    • 設定表格使用的字型
    • 引數 型別 說明
      font QtGui.QFont QT字型例項
      返回值:None
  • setSaveData

    • 設定是否要儲存資料到單元格物件
    • 引數 型別 說明
      saveData bool 是否要儲存資料到單元格
      返回值:None
  • initTable

    • 初始化表格。呼叫此介面前,一定要通過介面定義表格引數,否則使用表格的預設引數。
    • 返回值:None
  • registerEvent

    • 登錄檔格監聽的事件處理,事件型別由setEventType設定。
    • 返回值:None
  • updateEvent

    • 處理事件更新
    • 引數 型別 說明
      event Event 事件物件
      返回值:None
  • updateData

    • 將資料更新到表格中。新資料則在表格的第一行插入。
    • 引數 型別 說明
      data Object 表格每行資料對應的類物件
      返回值:None
  • resizeColumns

    • 調整各列的大小,使每個單元格可見。注意:若頻繁呼叫此介面,當表格資料多時,將會導致UI更新緩慢,導致UI被阻塞。
    • 返回值:None
  • setSorting

    • 設定是否允許根據表頭排序
    • 引數 型別 說明
      sorting bool 是否允許根據表頭排序
      返回值:None
  • saveToCsv

    • 儲存表格內容到CSV檔案
    • 返回值:None

VnTrader裡表格單元的類關係圖

VnTrader裡對錶格單元格進行封裝,這樣更容易處理資料的顯示。主要提供的介面是setContent。 Markdown

調整顯示方式(GroupBox、TabWidget)

GroupBox

QtGui.QGroupBox視窗部件提供了一個有標題的組合框視窗。組合框裡包含了不同的視窗控制元件。組合框裡可以採用QHBoxLayout,QVBoxLayout和QGridLayout對包含的視窗控制元件進行排版。 VnTrader裡CtaStrategyManager類繼承自GroupBox,這樣可以對CTA策略在介面上做統一的顯示和管理。QGroupBox類似於面向物件裡的組合功能,只是這裡組合的是視窗控制元件,這些視窗控制元件是同一個物件的不同的部件。

VnTrader裡GroupBox視窗

Markdown

TabWidget

QtGui.QTabWidget,多頁視窗,每一頁都是一個視窗,裡面包含了不同的視窗部件。這樣把相同的功能的視窗部件整合到一頁裡,節省了視窗空間。類似於Excel裡的每一頁。通過addTab新增一個視窗到一頁。

資料選擇工具(ComboBox,SpinBox)

ComboBox

QtGui.QComboBox是由一個文字輸入控制元件和一個下拉選單組成的。使用者可以從一個預先定義的列表裡選擇一個選項,同時也可以直接在文字框裡面輸入文字。通過addItems把預先定義的列表加到QComboBox的下拉選單裡。

VnTrader裡ComboBox視窗

Markdown

SpinBox

QtGui.QSpinBox控制元件(整數旋轉框)允許使用者通過單擊向上/向下按鈕來增加/減少當前顯示的整數值,也可以直接輸入旋轉框的值。如果該值是直接輸入旋轉框,一般需要按【Enter】鍵確認新值,該值是一個整數。通過setMinimum和setMaximum設定值的範圍。

QtGui.QDoubleSpinBox控制元件則是浮點數。

VnTrader裡SpinBox視窗

Markdown

使用按鈕呼叫功能

由於UI的處理只能通過主執行緒處理,非主執行緒處理UI會導致異常。所以QT裡通過訊號槽關聯UI的響應處理,這樣把UI的處理交給主執行緒。槽(slot)其實就是事件處理函式。 訊號(signal)一般用類變數定義,例如VnTrader裡的訊號定義:

signal = QtCore.pyqtSignal(type(Event()))

將訊號和處理關聯起來:

def connectSignal(self):
    """連線Signal"""
    self.signal.connect(self.updateTick)

對於PushButton的按鈕呼叫則使用如下程式碼:

button.clicked.connect(clickFunc)

這裡clicked是button的訊號。