Skip to content

应用模块开发GUI界面

vn.py edited this page Sep 4, 2017 · 2 revisions

作者:昊

目录

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的信号。

You can’t perform that action at this time.