VNPY_應用模組開發GUI介面
作者:昊
目錄
VnTrader的GUI設計
GUI介面可以直觀的顯示策略、行情、賬戶和交易的相關資訊。VnTrader的介面是基於PyQt開發的,主視窗主要包含賬戶相關視窗、行情視窗、交易視窗和錯誤及日誌視窗等。PyQt包裝了QT的C++介面,所以關於視窗的官方手冊,可以參考Qt Documentation。VnTrader的視窗控制元件主要包含在檔案uiBasicWidget.py。下面就VnTrader用到的主要視窗控制元件做逐一介紹。
表格控制元件(TableWidget)
表格是VnTrader裡主要的視窗控制元件,可以清楚的顯示二維關係。表格主要由表頭和表項(表格單元)組成,表頭又分為行表頭和列表頭。VnTrader裡沒有使用列表頭。
VnTrader裡表格的類關係圖
主視窗
子視窗的標題對應於表格類關係圖裡的類
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。
調整顯示方式(GroupBox、TabWidget)
GroupBox
QtGui.QGroupBox視窗部件提供了一個有標題的組合框視窗。組合框裡包含了不同的視窗控制元件。組合框裡可以採用QHBoxLayout,QVBoxLayout和QGridLayout對包含的視窗控制元件進行排版。 VnTrader裡CtaStrategyManager類繼承自GroupBox,這樣可以對CTA策略在介面上做統一的顯示和管理。QGroupBox類似於面向物件裡的組合功能,只是這裡組合的是視窗控制元件,這些視窗控制元件是同一個物件的不同的部件。
VnTrader裡GroupBox視窗
TabWidget
QtGui.QTabWidget,多頁視窗,每一頁都是一個視窗,裡面包含了不同的視窗部件。這樣把相同的功能的視窗部件整合到一頁裡,節省了視窗空間。類似於Excel裡的每一頁。通過addTab新增一個視窗到一頁。
資料選擇工具(ComboBox,SpinBox)
ComboBox
QtGui.QComboBox是由一個文字輸入控制元件和一個下拉選單組成的。使用者可以從一個預先定義的列表裡選擇一個選項,同時也可以直接在文字框裡面輸入文字。通過addItems把預先定義的列表加到QComboBox的下拉選單裡。
VnTrader裡ComboBox視窗
SpinBox
QtGui.QSpinBox控制元件(整數旋轉框)允許使用者通過單擊向上/向下按鈕來增加/減少當前顯示的整數值,也可以直接輸入旋轉框的值。如果該值是直接輸入旋轉框,一般需要按【Enter】鍵確認新值,該值是一個整數。通過setMinimum和setMaximum設定值的範圍。
QtGui.QDoubleSpinBox控制元件則是浮點數。
VnTrader裡SpinBox視窗
使用按鈕呼叫功能
由於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的訊號。