Python QT学习——一个简单的入门案例(一)

QT学习

文章目录

  • QT学习
  • 前言
  • 一、一个简单的例子
  • 二、用户操作处理signal和slot
  • 三、封装到类中
  • 前言

    开发QT主要用两个包:PySide2和PyQt5

    pip install PySide2
    

    一、一个简单的例子

    from PySide2.QtWidgets import QApplication, QMainWindow, QPushButton,  QPlainTextEdit
    #导入相关的类 
    
    app = QApplication([])#创建一个对象  作用事提供整个图形界面的管理
    
    window = QMainWindow() #创建一个主窗口对象
    window.resize(500, 400) #窗口大小 (宽度,高度)
    window.move(300, 310) #控制窗口显示的时候出现在屏幕显示器的位置
    window.setWindowTitle('薪资统计') #把薪资统计设置在标题栏上
    
    textEdit = QPlainTextEdit(window) #创建纯文本空间
    textEdit.setPlaceholderText("请输入薪资表")#创建提示文本
    textEdit.move(10,25)#在窗口处位置  如果有副窗口就显示在副窗口位置
    textEdit.resize(300,350) #指定大小
    
    button = QPushButton('统计', window) #设置按键
    button.move(380,80) #位置
    
    window.show() #显示界面,想要显示就必须要执行这一段代码
    
    app.exec_() #进入QApplication的事件处理循环  如果不加这句话,界面就会一闪而过 
    


    代码的讲解都在注释里

    QMainWindow、QPlainTextEdit、QPushButton 是3个控件类,分别对应界面的主窗口、文本框、按钮

    QApplication 提供了整个图形界面程序的底层管理功能,比如:初始化、程序入口参数的处理,用户事件(对界面的点击、输入、拖拽)分发给各个对应的控件,等等…既然QApplication要做如此重要的初始化操作,所以,我们必须在任何界面控件对象创建前,先创建它

    window.move(300, 310) 就决定了 主窗口的 左上角坐标在 相对屏幕的左上角 的X横坐标300像素, Y纵坐标310像素这个位置。

    textEdit.move(10,25) 就决定了文本框的 左上角坐标在 相对父窗口的左上角 的X横坐标10像素, Y纵坐标25像素这个位置。

    控件对象的 resize 方法决定了这个控件显示的大小。

    比如
    window.resize(500, 400) 就决定了 主窗口的 宽度为500像素,高度为400像素。

    textEdit.resize(300,350) 就决定了文本框的 宽度为300像素,高度为350像素。

    放在主窗口的控件,要能全部显示在界面上, 必须加上下面这行代码

    window.show()
    

    进入QApplication的事件处理循环,接收用户的输入事件(),并且分配给相应的对象去处理。

    app.exec_()
    

    如果不加窗口就会一闪而过,这是一个死循环,等待用户进行操作

    二、用户操作处理signal和slot

    在 Qt 系统中, 当界面上一个控件被操作时,比如 被点击、被输入文本、被鼠标拖拽等, 就会发出 信号 ,英文叫 signal 。就是表明一个事件(比如被点击、被输入文本)发生了。

    我们可以预先在代码中指定 处理这个 signal 的函数,这个处理 signal 的函数 叫做 slot 。

    from PySide2.QtWidgets import QApplication, QMainWindow, QPushButton,  QPlainTextEdit,QMessageBox
    
    def handleCalc():
        info = textEdit.toPlainText() #通过这个控件可以获取编辑框的文本内容
        # 薪资20000 以上 和 以下 的人员名单
        salary_above_20k = ''  #定义两个字符串
        salary_below_20k = ''
        for line in info.splitlines():
            if not line.strip():  #if没有内容就中止循环
                continue
            parts = line.split(' ')
            # 去掉列表中的空字符串内容
            parts = [p for p in parts if p] #列表推导式,过滤掉空字符串
            name,salary,age = parts  #将信息一一对应
            if int(salary) >= 20000:
                salary_above_20k += name + '\n' #+=用于字符串之间的连接 将大于20000的名字给salary_above_20k
            else:
                salary_below_20k += name + '\n'
        #QMessageBox 类可以用来弹出各种提示框
        QMessageBox.about(window,'统计结果',f'''薪资20000 以上的有:\n{salary_above_20k}\n薪资20000 以下的有:\n{salary_below_20k}''')
    
    app = QApplication([])
    
    window = QMainWindow()
    window.resize(500, 400)
    window.move(300, 300)
    window.setWindowTitle('薪资统计')
    
    textEdit = QPlainTextEdit(window)
    textEdit.setPlaceholderText("请输入薪资表")
    textEdit.move(10,25)
    textEdit.resize(300,350)
    
    button = QPushButton('统计', window)
    button.move(380,80)
    button.clicked.connect(handleCalc) #让 handleCalc 来 处理 button 被 点击的操作,如果按钮被点击了,就执行handleCalc这个函数。
    
    window.show()
    
    app.exec_()
    


    这样就将信息筛选出来了。

    三、封装到类中

    上面的代码把控件对应的变量名全部作为全局变量。如果要设计稍微复杂一些的程序,就会出现太多的控件对应的变量名。而且这样也不利于 代码的模块化。所以,我们通常应该把 一个窗口和其包含的控件,对应的代码全部封装到类中

    from PySide2.QtWidgets import QApplication, QMainWindow, QPushButton,  QPlainTextEdit,QMessageBox
    
    class Stats():  #类的里面放以下相应的操作
        def __init__(self):
            self.window = QMainWindow()
            self.window.resize(500, 400)
            self.window.move(300, 300)
            self.window.setWindowTitle('薪资统计')
    
            self.textEdit = QPlainTextEdit(self.window)
            self.textEdit.setPlaceholderText("请输入薪资表")
            self.textEdit.move(10, 25)
            self.textEdit.resize(300, 350)
    
            self.button = QPushButton('统计', self.window)
            self.button.move(380, 80)
    
            self.button.clicked.connect(self.handleCalc)
    
    
        def handleCalc(self):
            info = self.textEdit.toPlainText()
    
            # 薪资20000 以上 和 以下 的人员名单
            salary_above_20k = ''
            salary_below_20k = ''
            for line in info.splitlines():
                if not line.strip():
                    continue
                parts = line.split(' ')
                # 去掉列表中的空字符串内容
                parts = [p for p in parts if p]
                name,salary,age = parts
                if int(salary) >= 20000:
                    salary_above_20k += name + '\n'
                else:
                    salary_below_20k += name + '\n'
    
            QMessageBox.about(self.window,
                        '统计结果',
                        f'''薪资20000 以上的有:\n{salary_above_20k}
                        \n薪资20000 以下的有:\n{salary_below_20k}'''
                        )
    
    app = QApplication([])  #这个要放在类的外面
    stats = Stats()  
    stats.window.show()
    app.exec_()
    


    代码看起来就间接很多
    补充:
    定义 __init__方法,这里有三个参数,这个self指的是一会创建类的实例的时候这个被创建的实例本身(例中的self),你也可以写成其他的东西,比如写成me也是可以的,这样的话下面的self.window就要写成me.window。 这里为了区分前后两个是不同的东西,把前面那个大写了,等号左边的那个window(或Window)是实例的属性,后面那个是方法__init__的参数,两个是不同的)__init__还是有个特殊之处,那就是它不允许有返回值。如果你的__init__过于复杂有可能要提前结束的话,使用单独的return就好,不要带返回值。

    来源:我与nano

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python QT学习——一个简单的入门案例(一)

    发表评论