自己写一个类似vnpy的界面框架

概述

通过之前3次对vnpy的界面代码的研究,我们去模仿做一个vn.py的大框架。巩固一下PyQt5的学习。

这部分的代码相对来说没有难度和深度,基本上就是把PyQt5的组件进行了使用。主要应用了QVBoxLayout布局在交易下单的窗体tradingWidget上使用,其他的窗体都大多数用了QTableWidget

关于QTableWidget的教程我找到了一篇:PyQt5高级界面控件之QTableWidget(四)

在vnpy中值得自己学习的是:

  1. vnpy抽象了所有的QTableWidget的对象,因为交易类的系统用到了大量的列表。所以建立了一个BaseMonitor的对象
  2. 不同的列显示的方式不太一样,有的部分可能是直接显示出来vaule,而有的列表显示的可能是多空,所以定义了Cell对象。
  1. class BaseCell(QtWidgets.QTableWidgetItem):
  2. """
  3. General cell used in tablewidgets.
  4. """
  5. def __init__(self, content: Any, data: Any):
  6. """"""
  7. super(BaseCell, self).__init__()
  8. self.setTextAlignment(QtCore.Qt.AlignCenter)
  9. self.set_content(content, data)
  10. def set_content(self, content: Any, data: Any):
  11. """
  12. Set text content.
  13. """
  14. self.setText(str(content))
  15. self._data = data
  16. def get_data(self):
  17. """
  18. Get data object.
  19. """
  20. return self._data
  1. class EnumCell(BaseCell):
  2. """
  3. Cell used for showing enum data.
  4. """
  5. def __init__(self, content: str, data: Any):
  6. """"""
  7. super(EnumCell, self).__init__(content, data)
  8. def set_content(self, content: Any, data: Any):
  9. """
  10. Set text using enum.constant.value.
  11. """
  12. if content:
  13. super(EnumCell, self).set_content(content.value, data)

根据方向不一样,显示不同的颜色

  1. class DirectionCell(EnumCell):
  2. """
  3. Cell used for showing direction data.
  4. """
  5. def __init__(self, content: str, data: Any):
  6. """"""
  7. super(DirectionCell, self).__init__(content, data)
  8. def set_content(self, content: Any, data: Any):
  9. """
  10. Cell color is set according to direction.
  11. """
  12. super(DirectionCell, self).set_content(content, data)
  13. if content is Direction.SHORT:
  14. self.setForeground(COLOR_SHORT)
  15. else:
  16. self.setForeground(COLOR_LONG)
  1. class TimeCell(BaseCell):
  2. """
  3. Cell used for showing time string from datetime object.
  4. """
  5. def __init__(self, content: Any, data: Any):
  6. """"""
  7. super(TimeCell, self).__init__(content, data)
  8. def set_content(self, content: Any, data: Any):
  9. """
  10. Time format is 12:12:12.5
  11. """
  12. if content is None:
  13. return
  14. timestamp = content.strftime("%H:%M:%S")
  15. millisecond = int(content.microsecond / 1000)
  16. if millisecond:
  17. timestamp = f"{timestamp}.{millisecond}"
  18. self.setText(timestamp)
  19. self._data = data

界面部分大同小异。接下来研究下MainEngine部分。看看引擎是如何把所有的界面和数据接口穿插起来的。

vnpy源码阅读学习(4):自己写一个类似vnpy的UI框架的更多相关文章

  1. vnpy源码阅读学习(1):准备工作

    vnpy源码阅读学习 目标 通过阅读vnpy,学习量化交易系统的一些设计思路和理念. 通过阅读vnpy学习python项目开发的一些技巧和范式 通过vnpy的设计,可以用python复现一个小型简单的 ...

  2. vnpy源码阅读学习(5):关于MainEngine的代码阅读

    关于MainEngine的代码阅读 在入口文件中,我们看到了除了窗体界面的产生,还有关于MainEngine和EventEngin部分.今天来学习下MainEngine的代码. 首先在run代码中,我 ...

  3. vnpy源码阅读学习(8):关于app

    关于app 在入口程序中,我们看到了把 gateway,app, 各类的engine都添加到mainEngine中来.不难猜测gateway主要是处理跟外部的行情,接口各方面的代码,通过别人的文章也不 ...

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

    串在一起 我们已经分析了UI.MainEngine.EventEngine.然后他们几个是如何发挥作用的呢?我总结了一张图: 我们来具体的看看UI部分是如何跟EventEngine穿插起来的 \exa ...

  5. vnpy源码阅读学习(3):学习vnpy的界面的实现

    学习vnpy的界面的实现 通过简单的学习了PyQt5的一些代码以后,我们基本上可以理解PyQt的一些用法,下面让我们来先研究下vnpy的UI部分的代码. 首先回到上一节看到的run.py(/vnpy/ ...

  6. vnpy源码阅读学习(2):学习PyQt5

    PyQt5的学习 花费了一个下午把PyQt5大概的学习了下.找了一个教程 PyQt5教程 跟着挨着把上面的案例做了一遍,大概知道PyQt5是如何生成窗体,以及控件的.基本上做到如果有需求要实现,查查手 ...

  7. vnpy源码阅读学习(9)回到OptionMaster

    回到OptionMaster 根据我们对APP调用的代码阅读,我们基本上知道了一个APP是如何被调用,那么我们回到OptionMaster学习下这个APP的实现. 看看结构 class OptionM ...

  8. Spring源码阅读学习一

    昨天抽时间阅读Spring源码,先从spring 4.x的core包开始吧,除了core和util里,首当其冲的就是asm和cglib. 要实现两个类实例之间的字段的复制功能: 多年之前用C#,因为阅 ...

  9. 12.源码分析—如何为SOFARPC写一个序列化?

    SOFARPC源码解析系列: 1. 源码分析---SOFARPC可扩展的机制SPI 2. 源码分析---SOFARPC客户端服务引用 3. 源码分析---SOFARPC客户端服务调用 4. 源码分析- ...

随机推荐

  1. 走过的laravel-admin 的坑

    一.http://laravel-admin.org/docs/#/zh/  大家可以根据这个安装1.5 版本的laravel后台管理, 他很方便哦,有很多方法他都自己自己封装了. 二.大家如果想好好 ...

  2. python基础数据类型汇总

    list和dict 在循环一个列表和字典时,最好不要删除其中的元素,这样会使索引发生改变,从而报错! lis = [11, 22, 33, 44, 55] for i in range(len(lis ...

  3. React 蚂蚁金服+ Antd 组件使用技巧

    安装antd 组件 yarn add antd -D import {  Card,Button,Table,From,Modal ,Select  } from 'antd'; .引入就可以使用了 ...

  4. UVA 11732——Trie

    解题思路: 首先我们可以发现: 1.若两个字符串A.B不相等,且它们的公共前缀为S,则它们的比较次数为:2 * len(S) + 1: 2.若两个字符串相等,设为A,则它们的比较次数为 2 * ( l ...

  5. 2019-9-2-Visual-Studio-自定义项目模板

    title author date CreateTime categories Visual Studio 自定义项目模板 lindexi 2019-09-02 12:57:38 +0800 2018 ...

  6. linux inode 结构

    inode 结构由内核在内部用来表示文件. 因此, 它和代表打开文件描述符的文件结构是不 同的. 可能有代表单个文件的多个打开描述符的许多文件结构, 但是它们都指向一个单个 inode 结构. ino ...

  7. linux预备知识

    我们正在接近去看一些实际的模块代码. 但是首先, 我们需要看一些需要出现在你的模块 源码文件中的东西. 内核是一个独特的环境, 它将它的要求强加于要和它接口的代码上. 大部分内核代码包含了许多数量的头 ...

  8. springboot+jpa分页(Pageable+Page)

    Pageable+Page实现分页无需配置,也不需要加入jar包(maven依赖) Controller控制层 package com.gxuwz.late.controller; import co ...

  9. H3C命令调试debugging--用户视图

    <H3C>terminal debugging     //使用debugging必须使用的命令--打开调试信 息的屏幕输出开关 <H3C>display debugging  ...

  10. 使用FluentEmail发送outlook邮件

    一,邮箱账号相关设置 1,创建outLook邮箱. 2,进入邮箱设置->同步电子邮件->允许设备和应用使用pop 3,设置microsoft账号的应用程序密码->进入安全性页面-&g ...