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