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,QMessageBoxdef 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,QMessageBoxclass 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就好,不要带返回值。