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的基础.笔者借鉴了网上很多搭建环境的方法,也尝试了很多,接下来总结两种个人认为比较简便实用的方法.读者可根据自己的需要自行选择. 方法一:搭建基础 ...
随机推荐
- jq杂项方法/工具方法----isArray()
https://www.cnblogs.com/sandraryan/ $.isArray()函数用于判断指定参数是否是一个数组.返回布尔值. <!DOCTYPE html> <ht ...
- win10 uwp 手把手教你使用 asp dotnet core 做 cs 程序
本文是一个非常简单的博客,让大家知道如何使用 asp dot net core 做后台,使用 UWP 或 WPF 等做前台. 本文因为没有什么业务,也不想做管理系统,所以看到起来是很简单. Visua ...
- [转]Node.js中package.json中^和~的区别
webpack 项目的package.json 文件列出了项目所依赖的插件和库,同时也给出了对应的版本说明,但是在版本说明前面还有个符号:'^'(插入符号)和'~'(波浪符号),总结了下他们之间的区别 ...
- spring boot The request was rejected because the URL was not normalized
升级spring boot 1.5.10.RELEASE 版本后,突然发现之前能Nginx代理能请求的地址抛如下异常: org.springframework.security.web.firewal ...
- C# 输出文件夹下的所有文件
问题:如何输出给定文件夹目录下面的所有文件的名称? C#代码: using System; using System.IO; namespace MyTest { public class Progr ...
- java 泛型的嵌套(map例子)
package july7; //泛型加Map的输出! import java.util.Iterator; import java.util.Map; import java.util.Map.En ...
- 2019-8-31-git-通过-SublimeMerge-处理冲突
title author date CreateTime categories git 通过 SublimeMerge 处理冲突 lindexi 2019-08-31 16:55:59 +0800 2 ...
- 基于串口调试助手的WIFI模块调试-FPGA简单联网(点灯)
根据正点原子的<ATK-ESP8266 WIFI用户手册>,使用XCOM V2.2串口调试助手测试WIFI模块[26].在本系统中运用到的功能主要是TCP/IP模式中的TCP Client ...
- Build 2017(简体中文视频)
视频汇总地址 入口 可筛选某天的视频 部分包含中文字幕 我看过的视频 Day1 #MSBuild Day 1 Keynote(中文字幕) Three Runtimes, one standard… . ...
- linux_jdk,zookeeper,kafka安装
若是在虚拟机安装最好先进行下面的安装 1.1修改各个虚拟机主机名 vi /etc/sysconfig/network 1.2修改主机名和IP的映射关系 vi /etc/hosts 1.3关闭防火墙 # ...