zoukankan      html  css  js  c++  java
  • Python学习笔记——PyQt入门

    简介

    PyQt5是作为一套Python模块实现的,已经有超过620个类和6000个函数与方法。它是一个运行在所有主流操作系统上的多平台组件,包括Unix,Windows和Mac OS。PyQt5是双重许可的。开发者可以选择GPL和商业许可。


    常用控件

    按钮类

    QPushButton 普通按钮

     

    点击按钮就会触发一个clicked()信号

    QRadioButton 单选框

     

    可以在选中或者未选中之间切换,定义了“多选一”的选择

    QCheckBox 复选框

     

    提供了一个带文本标签的复选框,提供的是“多选多”的选择

    显示组件

    QLabel 标签

     

    显示文字或者图片,只读的,不允许对内容进行更改

    QTextBrowser 文本区域

     

    用于显示大段文本

    QTableView表格视图控件

     

    需要和QStandardItemModel配套使用,这套框架是基于MVC设计模式设计的

    输入组件

    QLineEdit 单行文本框

     

    单行文本输入

    QTextEdit 多行文本框

     

    多行文本输入(富文本)

    QPlainTextEdit多行文本框

     

    多行文本输入(纯文本)


    三大窗口--mainwindow、dialog和widget

    Mainwindow可以显示菜单,工具栏,状态栏、托盘等功能,作为主应用程序窗口。

    Dialog通常作为一个顶层窗口出现,允许用户进行一些选择,并返回用户选择的结果。然后应用程序就可以根据用户刚才的选择决定下一步做什么。

    Widget类是是用户界面的一个基本单元,每种类型的组件都是Widget的子类。每个Widget可以放置在一个UI内或者作为一个独立的窗口。

    在新建一个ui文件时,如果是主界面,就选择QMainWindow;如果是顶级窗口,就选择QDialog;如果不确定或者前两种情况都有,就选择QWidget。

    由于Qt Designer和PyUIC两个工具的存在,用可视化编程再自动生成代码的开发方式非常方便。但是在使用的时候需要一些技巧,就是不要去修改PyUIC生成的.py文件,可以在主程序中重写一个类去继承它,并且把需要增加的方法也放到子类里面。这样当我们再对ui文件进行修改,就不需要再做太多的重复工作。


    信号和槽

    所有的GUI程序都是事件驱动的。事件主要由用户触发,但也可能有其他触发方式。PyQt5有一个独特的signal&slot(信号槽)机制来处理事件。

    sender是发出信号的对象。receiver是接收信号的对象。slot(插槽)是对信号做出反应的方法。信号槽用于对象间的通信。signal在某一特定事件发生时被触发,slot可以是任何callable对象。当signal触发时会调用与之相连的slot。

    下面一段程序是使用信号槽的例子:

    # 触发RecButton的clicked事件,执行显示对应窗口的时间
    self.RecButton.clicked.connect(self.ToRecognize)

    在这里我们主窗口RecButton按钮的clicked信号连接到主窗口的ToRecognize函数插槽。当RecButton按钮被按下,clicked信号触发,执行ToRecognize函数。


    一个例子

    要求设计一个软件,主界面上三个按钮,对应实现三种功能。编程思路大体如下:

    1. Qt Designer设计一个Mainwindow.ui文件和三个Dialog.ui文件;再用PyUIC将其分别生成对应的.py文件。

    2. 从生成的.py文件加载窗口类

    from mainwindow import  Ui_MainWindow
    
    from RecognizeDialog import  Ui_RecognizeDialog
    
    from RegisterDialog import  Ui_RegisterDialog
    
    from ManagementDialog import  Ui_ManagementDialog

    3. 在主程序中重写类分别去继承原来的类

    class MainWindow(QMainWindow, Ui_MainWindow):
    
        def __init__(self):
    
            super(MainWindow, self).__init__()
    
            self.setupUi(self)
    
    class RecognizeDialog(QMainWindow, Ui_RecognizeDialog):
    
    ......
    
    class RegisterDialog(QMainWindow, Ui_RegisterDialog):
    
    ......
    
    class ManagementDialog(QMainWindow, Ui_ManagementDialog):
    
    ......

    4. 在主窗口类中定义显示Dialog窗口的函数

    class MainWindow(QMainWindow, Ui_MainWindow):
    
        ......
    
        # 定义对应的显示函数
    
        def ToRecognize(self):
    
            self.Recognize = RecognizeDialog()
    
            self.Recognize.show()
    
        def ToRegister(self):
    
            self.Register = RegisterDialog()
    
            self.Register.show()
    
        def ToShowUsers(self):
    
            self.ShowUsers = ManagementDialog()
    
            self.ShowUsers.show()

    5. 在主窗口类中建立信号&槽,将上一步定义的显示函数作为槽,将对应buttonclicked事件作为信号

    class MainWindow(QMainWindow, Ui_MainWindow):
    
        def __init__(self):
    
            ......
    
            self.Recognition.clicked.connect(self.ToRecognize)
    
            self.Register.clicked.connect(self.ToRegister)
    
            self.ShowUsers.clicked.connect(self.ToShowUsers)

    6. 在三个Dialog窗口类中定义相关函数,实现需要的功能。

    class RecognizeDialog(QMainWindow, Ui_RecognizeDialog):
        ......
        def function1(self, Dialog):
            ......
  • 相关阅读:
    Android Studio踩的坑之导入别人的Android Studio项目
    获取已发布微信小游戏和小程序源码
    小程序第三方框架对比 ( wepy / mpvue / taro )
    项目中常用的MySQL 优化
    最全反爬虫技术
    MySQL Explain详解
    php接口安全设计
    PHP进程间通信
    PHP进程及进程间通信
    springBoot优雅停服务配置
  • 原文地址:https://www.cnblogs.com/yucen/p/9343560.html
Copyright © 2011-2022 走看看