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图形界面编程

  • 相关阅读:
    JavaScript中的闭包
    SQL 备忘
    SqlServer 2005 升级至SP2过程中出现"身份验证"无法通过的问题
    unable to start debugging on the web server iis does not list an application that matches the launched url
    Freebsd 编译内核
    Freebsd 6.2中关于无线网络的设定
    【Oracle】ORA01219
    【Linux】Windows到Linux的文件复制
    【Web】jar命令行生成jar包
    【Linux】CIFS挂载Windows共享
  • 原文地址:https://www.cnblogs.com/bbird/p/12192699.html
Copyright © 2011-2022 走看看