2022年 11月 5日

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

QT学习

文章目录

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

前言

开发QT主要用两个包:PySide2和PyQt5
在这里插入图片描述

pip install PySide2
  • 1

一、一个简单的例子

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的事件处理循环  如果不加这句话,界面就会一闪而过 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

在这里插入图片描述
代码的讲解都在注释里

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()
  • 1

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

app.exec_()
  • 1

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

二、用户操作处理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_()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

在这里插入图片描述
这样就将信息筛选出来了。

三、封装到类中

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

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_()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

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