vnpy源码阅读学习(2):学习PyQt5
PyQt5的学习
花费了一个下午把PyQt5大概的学习了下。找了一个教程 PyQt5教程 跟着挨着把上面的案例做了一遍,大概知道PyQt5是如何生成窗体,以及控件的。基本上做到如果有需求要实现,查查手册,搜搜百度能实现的水平。
另外强烈推荐:PyQt5图形界面编程
PyQt5就是python的GUI库,用它来做一些桌面软件,是QT的python版本。具体的简介就不赘述了。记录点自己学习的干货。
使用大概流程
首先当然是安装PyQt5的类库
pip3 install PyQt5
PyQt5的使用
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIcon
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI() #界面绘制交给InitUi方法
def initUI(self):
#设置窗口的位置和大小
self.setGeometry(300, 300, 300, 220)
#设置窗口的标题
self.setWindowTitle('Icon')
#设置窗口的图标,引用当前目录下的web.png图片
self.setWindowIcon(QIcon('web.png'))
#显示窗口
self.show()
if __name__ == '__main__':
#创建应用程序和对象
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
然后几乎就可以跑出来一个窗体了。至于窗体上的设置,几乎看着英语就能知道如何写。比如
self.setWindowTitle('设置标题')
self.setWindowIcon(QIcon('web.png')) #设置icon图标
常见的组件
- QCheckBox
- QPushButton
- QSlider
- QProgressBar
- QCalendarWidget
- QPixmap
- QLineEdit
- QSplitter
- QComboBox
以上是这个教程上讲到的控件。控件部分个人认为不需要花费时间去研究,如果用到了查查,经常用到了,自然能记得住。没必要深入研究。
要使用一个组件,直接实例化,然后parent指定为当前的对象。就会出现在当前对象上
button = QButton('按钮名称',self)
#然后设置一些组件的特性并且把组件触发的时间插入插槽就可以了,插槽接下来讲解
button.move(200,100)
button.clicked.connect(self.button_click)
信号和插槽 Signal&slot
这个应该算是重点了,因为UI最后还是要接受用户的点击、输入,要有事件产生并且能有处理事件的函数和方法。类似C#中的事件委托一样。
插槽
要处理一个事件,比如一个按钮的事件我们用插槽接受事件信号。如下伪代码
button.clicked.connect(self.button_click)
#插槽
def button_click(self):
#被点击执行的代码
#信号的发送者
sender = self.sender()
信号与发出信号
#我们需要定义一个发送信号的对象
class Communicate(QObject):
closeApp = pyqtSignal()
#在发送信号的窗体类代码
class Example(QMainWindow):
def __init__(self):
self.c = Communicate()
def mousePressEvent(self, event):
#出发信号的发送
self.c.closeApp.emit()
另外还有几个问题需要进一步思考:
- 发送如何写在类中,比如自定义一个控件,然后这个类出发事件,可以给别的类调用实例化的对象的时候处理?
- 信号槽如何发送带参数的消息。
对话框
- QInputDialog
- QColorDialog
- QFontDialog
- QFileDialog
- QMessageBox
个人认为对话框没有太多需要讲解的。用到了查查,知道如何弹出,如何获得弹出后操作的结果就可以了。
关于窗体如何弹出。每一个集成了QWidget的窗体,都会有一个show方法,在需要弹出的地方调用他们就可以弹出了。
模态窗体
| 方法 | 说明 |
|---|---|
| setWindowModality() | Qt.NonModal:非模态,可以和程序的其他窗口进行交互 |
| Qt.WindowModal:窗口模态,程序在未处理玩当前对话框时,将阻止和对话框的父窗口进行交互 | |
| Qt.ApplicationModal:应用程序模态,阻止和任何其他窗口进行交互 |
绘图
如果要自定义控件,少不了需要做绘图。
python的控件会自动调用paintEvent事件。所以只需要调用paitEvent事件,就可以做到绘图。
def paintEvent(self, event):
qp = QPainter()
qp.begin(self)
self.drawText(event, qp)
qp.end()
而paintEvent会在需要控件重绘的时候,进行调用,如果要强制重汇。需要在这个方法中调用:
.update()
自定义控件
通过可视化的方法设计GUI
参考
vnpy源码阅读学习(2):学习PyQt5的更多相关文章
- vnpy源码阅读学习(1):准备工作
vnpy源码阅读学习 目标 通过阅读vnpy,学习量化交易系统的一些设计思路和理念. 通过阅读vnpy学习python项目开发的一些技巧和范式 通过vnpy的设计,可以用python复现一个小型简单的 ...
- vnpy源码阅读学习(3):学习vnpy的界面的实现
学习vnpy的界面的实现 通过简单的学习了PyQt5的一些代码以后,我们基本上可以理解PyQt的一些用法,下面让我们来先研究下vnpy的UI部分的代码. 首先回到上一节看到的run.py(/vnpy/ ...
- vnpy源码阅读学习(4):自己写一个类似vnpy的UI框架
自己写一个类似vnpy的界面框架 概述 通过之前3次对vnpy的界面代码的研究,我们去模仿做一个vn.py的大框架.巩固一下PyQt5的学习. 这部分的代码相对来说没有难度和深度,基本上就是把PyQt ...
- vnpy源码阅读学习(5):关于MainEngine的代码阅读
关于MainEngine的代码阅读 在入口文件中,我们看到了除了窗体界面的产生,还有关于MainEngine和EventEngin部分.今天来学习下MainEngine的代码. 首先在run代码中,我 ...
- vnpy源码阅读学习(8):关于app
关于app 在入口程序中,我们看到了把 gateway,app, 各类的engine都添加到mainEngine中来.不难猜测gateway主要是处理跟外部的行情,接口各方面的代码,通过别人的文章也不 ...
- vnpy源码阅读学习(9)回到OptionMaster
回到OptionMaster 根据我们对APP调用的代码阅读,我们基本上知道了一个APP是如何被调用,那么我们回到OptionMaster学习下这个APP的实现. 看看结构 class OptionM ...
- vnpy源码阅读学习(7):串在一起
串在一起 我们已经分析了UI.MainEngine.EventEngine.然后他们几个是如何发挥作用的呢?我总结了一张图: 我们来具体的看看UI部分是如何跟EventEngine穿插起来的 \exa ...
- Kubernetes 学习(九)Kubernetes 源码阅读之正式篇------核心组件之 Scheduler
0. 前言 继续上一篇博客阅读 Kubernetes 源码,参照<k8s 源码阅读>首先学习 Kubernetes 的一些核心组件,首先是 kube-scheduler 本文严重参考原文: ...
- 搭建 Spring 源码阅读环境
前言 有一个Spring源码阅读环境是学习Spring的基础.笔者借鉴了网上很多搭建环境的方法,也尝试了很多,接下来总结两种个人认为比较简便实用的方法.读者可根据自己的需要自行选择. 方法一:搭建基础 ...
随机推荐
- Python--day19--os模块
os模块 os模块是与操作系统交互的一个接口 os.makedirs('dirname1/dirname2') 可生成多层递归目录 os.removedirs('dirname1') 若目录为空,则删 ...
- 2012-2013 Northwestern European Regional Contest (NWERC 2012)
B - Beer Pressure \(dp(t, p_1, p_2, p_3, p_4)\)表示总人数为\(t\),\(p_i\)对应酒吧投票人数的概率. 使用滚动数组优化掉一维空间. 总的时间复杂 ...
- 【BZOJ 1004】 [HNOI2008]Cards
[题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1004 [题意] 给你sr+sb+sg张牌,(令n=sr+sb+sg),让你把这n张牌染 ...
- 总结thinkphp快捷查询getBy、getField、getFieldBy用法及场景
thinkphp作为国内现阶段最成熟的框架:没有之一: 不得不说是有好些特别方便的方法的: 然而如果初接触thinkphp的时候难免会被搞的有点迷茫: for example这些: getBy get ...
- Activiti工作流引擎学习(一)
1.部署对象和流程定义相关表:RepositoryService act_re_deployment: 部署对象表:一次部署的多个文件的信息,对于不需要的流程可以删除和修改 act_re_procde ...
- git常用常用操作指令
GIT操作 1:git init 初始化空的仓库,会在当前文件夹生成一个隐藏.git的文件夹,相当于一个仓库. 2:提交代码的流程:工作代码区-->暂存区 -->主仓库 -->服务器 ...
- Vue CLI 创建项目
使用命令创建VUE项目 运行以下命令[vue create [项目名]]来创建一个新项目: vue create hello-world 警告 如果你在 Windows 上通过 minTTY 使用 G ...
- C语言中的优先级和类型转换分析
一.优先级 1.易错的优先级 二.类型转换 在C语言中,存在强制类型装换,也存在隐式类型转换,隐式类型转换实际上属于强制类型转换,隐式类型转换要点如图. (1)举例:算术运算式中,低类型转换为高类型 ...
- python单例设计模式
class Dog(object): __instance = None def __init__(self): pass def __new__(cls): if not cls.__instanc ...
- 机器学习- Numpy基础 吐血整理
Numpy是专门为数据科学或者数据处理相关的需求设计的一个高效的组件.听起来是不是挺绕口的,其实简单来说就2个方面,一是Numpy是专门处理数据的,二是Numpy在处理数据方面很牛逼(肯定比Pytho ...