zoukankan      html  css  js  c++  java
  • 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图标
    

    常见的组件

    1. QCheckBox
    2. QPushButton
    3. QSlider
    4. QProgressBar
    5. QCalendarWidget
    6. QPixmap
    7. QLineEdit
    8. QSplitter
    9. 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()
    

    另外还有几个问题需要进一步思考:

    1. 发送如何写在类中,比如自定义一个控件,然后这个类出发事件,可以给别的类调用实例化的对象的时候处理?
    2. 信号槽如何发送带参数的消息。

    对话框

    1. QInputDialog
    2. QColorDialog
    3. QFontDialog
    4. QFileDialog
    5. 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

    参考

    PyQt5-简明中文教程

    Qt5文档
    PyQt5图形界面编程

  • 相关阅读:
    tar (child): gzip: Cannot exec: No such file or directory
    通过应用数字格式来修复文本格式的数字
    Logback
    Transport
    nginx note
    docker note
    k8s note
    spring boot properties
    Windows 和 Linux 的文件名
    安装配置ubuntu的web项目(新)
  • 原文地址:https://www.cnblogs.com/bbird/p/12192699.html
Copyright © 2011-2022 走看看