读者在阅读本节前需要掌握Python基础的语法知识
Python3 教程 | 菜鸟教程https://www.runoob.com/python3/python3-tutorial.html
本节以“简易计算器”为案例来展开介绍。
在Qt Creater中新建项目完成后,首先绘制如下界面。
绘制完成后,将界面中的控件的“属性名”进行更改,以方便后续编程的引用。
在属性中更改“objectName”选项。这里作者将界面中3行4列的文本框按照行列顺序进行命名,分别命名为“tx11、tx12、tx13、tx21、tx22、tx23、tx31、tx32、tx33、tx41、tx42、tx43。将右侧的四个按钮按顺序命名为bu1、bu2、bu3、bu4。
完成上述操作后,我们进入python代码编写界面,即在项目列表中双击打开widget.py文件。
我们可以看到其中已有Qt Creater自动生成的模板代码。
# This Python file uses the following encoding: utf-8
import os
from pathlib import Path
import sys
from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtCore import QFile
from PySide6.QtUiTools import QUiLoader
class Widget(QWidget):
def __init__(self):
super(Widget, self).__init__()
self.load_ui()
def load_ui(self):
loader = QUiLoader()
path = os.fspath(Path(__file__).resolve().parent / "form.ui")
ui_file = QFile(path)
ui_file.open(QFile.ReadOnly)
loader.load(ui_file, self)
ui_file.close()
if __name__ == "__main__":
app = QApplication([])
widget = Widget()
widget.show()
sys.exit(app.exec_())
此时我们运行程序,是可以看到程序界面的出现的,(这是因为Qt Creater自动生成的模板代码可以将界面文件加载出来,假如我们删除这些代码再次运行就不会出现界面),但是此时界面中没有任何功能的实现。
现在我们要为界面添加功能,以界面中的第一行的功能实现为例来介绍。
我们在第一行前两个文本框输入数字,单击第一个按钮后,在第一行第三个文本框中显示前两个文本框中数字相加的结果。即单击按钮使文本框显示结果。
上一节介绍了信号与槽,在这里按钮即为发送者,单击即为信号,文本框即为接收者,显示结果即为槽。
- 首先我们编写槽(即功能代码)。
我们定义一个函数,将此函数进行命名,这里作者命名为”sum“。
代码如下:
def sum(self):
然后在此函数内进行功能代码编写。
#首先获取前两个文本框的内容。这里的内容是字符串类型(str),需将其转换为数字类型(float),然后再对其求和。
获取文本框内容的代码为 :
文本框属性名.text()
以第一行第一列的文本框为例,代码即为:
tx11.text() #属性名为tx11的文本内容
然后再进行字符串转数字的操作。(如果不转数字,就没办法进行求和操作。)代码如下:
float(tx11.text()) #将属性名为tx11的文本内容转为数字
为了后续的方便,我们将其赋值给一个变量,代码如下:
a=float(tx11.text()) #属性名为tx11的文本内容转为数字,并赋值给a
提取第二个文本框内容的方法同上,代码如下:
b=float(tx12.text()) #属性名为tx12的文本内容转为数字,并赋值给b
然后我们进行求和。(为了使用方便,将其赋值给一个新变量。)代码如下:
c=a+b #对a、b求和,并赋值给c
这样”c“就是我们最终求出的结果,然后我们需要将结果显示到第三个文本框中。
文本框显示内容的代码为:
文本框属性名.setText( ) #括号内即为要设置的文本内容
因为文本框内是字符串类型,然后我们还需要将”c“转换为字符串类型才能赋值到文本框,代码如下:
tx13.setText(str(c)) #设置第三个文本框的内容为c的值的字符串类型
最终,此槽函数的代码内容为:
def sum(self):
a=float(tx11.text()) #属性名为tx11的文本内容转为数字,并赋值给a
b=float(tx12.text()) #属性名为tx12的文本内容转为数字,并赋值给b
c=a+b #对a、b求和,并赋值给c
tx13.setText(str(c)) #设置第三个文本框的内容为c
这样我们就完成了槽函数的编写。然后我们需要将此槽函数进行应用,即实现单击按钮显示结果这一过程。
代码格式如下
发送者.信号.connect(槽函数)
在这里代码即为:
bu1.clicked.connect(self.sum) #单击第一个按钮后,sum函数开始运行。
全部代码如下:
bu1.clicked.connect(self.sum) #单击第一个按钮后,sum函数开始运行。
def sum(self):
a=float(tx11.text()) #属性名为tx11的文本内容转为数字,并赋值给a
b=float(tx12.text()) #属性名为tx12的文本内容转为数字,并赋值给b
c=a+b #对a、b求和,并赋值给c
tx13.setText(str(c)) #设置第三个文本框的内容为c
到这里功能代码已经完成,软件界面中的减法、乘法、除法的实现与此类似。
然后我们需要将这些代码放到上面的widget.py文件中。
现在开始介绍放置方法,我们回到模板文件中,在作者备注了”#加载UI文件“的那一行,我们可以看到此行代码只是加载了UI文件,但是没有将文件赋值到程序内部,所以我们无法去调用UI文件中的内容。
# This Python file uses the following encoding: utf-8
import os
from pathlib import Path
import sys
from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtCore import QFile
from PySide6.QtUiTools import QUiLoader
class Widget(QWidget):
def __init__(self):
super(Widget, self).__init__()
self.load_ui()
def load_ui(self):
loader = QUiLoader()
path = os.fspath(Path(__file__).resolve().parent / "form.ui")
ui_file = QFile(path)
ui_file.open(QFile.ReadOnly)
loader.load(ui_file, self) #加载UI文件
ui_file.close()
if __name__ == "__main__":
app = QApplication([])
widget = Widget()
widget.show()
sys.exit(app.exec_())
我们对其进行下述更改。
self.ui=loader.load(ui_file, self) #ui文件赋值给self.ui
完成上述操作后,我们可以知道ui(界面)文件赋值到self.ui内,这样我们需要将上面我们所写的实现加法功能的代码中涉及到界面的属性名的前加上self.ui。
如下所示:
self.ui.bu1.clicked.connect(self.sum)
def sum(self):
a=float(self.ui.tx11.text())
b=float(self.ui.tx12.text())
c=a+b
self.ui.tx13.setText(str(c))
将上述代码中的第一行放置于def load_ui(self):函数的内部,且要在”加载ui“的代码后面。槽函数放置于class Widget(QWidget):内且与内部的其它函数位于同一缩进等级。
如下所示:
# This Python file uses the following encoding: utf-8
import os
from pathlib import Path
import sys
from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtCore import QFile
from PySide6.QtUiTools import QUiLoader
class Widget(QWidget):
def __init__(self):
super(Widget, self).__init__()
self.load_ui()
def load_ui(self):
loader = QUiLoader()
path = os.fspath(Path(__file__).resolve().parent / "form.ui")
ui_file = QFile(path)
ui_file.open(QFile.ReadOnly)
self.ui = loader.load(ui_file, self) #加载UI文件
ui_file.close()
self.ui.bu1.clicked.connect(self.sum) #单击第一个按钮后,sum函数开始运行。
def sum(self): #槽函数
a=float(self.ui.tx11.text())
b=float(self.ui.tx12.text())
c=a+b
self.ui.tx13.setText(str(c))
if __name__ == "__main__":
app = QApplication([])
widget = Widget()
widget.show()
sys.exit(app.exec_())
这样我们就完成了界面中第一行加法的实现。
界面功能实现的全部代码如下:
# This Python file uses the following encoding: utf-8
import os
from pathlib import Path
import sys
from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtCore import QFile
from PySide6.QtUiTools import QUiLoader
class Widget(QWidget):
def __init__(self):
super(Widget, self).__init__()
self.load_ui()
def load_ui(self):
loader = QUiLoader()
path = os.fspath(Path(__file__).resolve().parent / "form.ui")
ui_file = QFile(path)
ui_file.open(QFile.ReadOnly)
self.ui = loader.load(ui_file, self)
ui_file.close()
self.setWindowTitle("简易计算器") #也可以在这里进行界面属性的设置
self.ui.bu1.clicked.connect(self.sum)
self.ui.bu2.clicked.connect(self.min)
self.ui.bu3.clicked.connect(self.mul)
self.ui.bu4.clicked.connect(self.div)
def sum(self):
a=float(self.ui.tx11.text())
b=float(self.ui.tx12.text())
c=a+b
self.ui.tx13.setText(str(c))
def min(self):
a = float(self.ui.tx21.text())
b = float(self.ui.tx22.text())
c = a - b
self.ui.tx23.setText(str(c))
def mul(self):
a = float(self.ui.tx31.text())
b = float(self.ui.tx22.text())
c = a * b
self.ui.tx33.setText(str(c))
def div(self):
a = float(self.ui.tx41.text())
b = float(self.ui.tx42.text())
c = a /b
self.ui.tx43.setText(str(c))
if __name__ == "__main__":
app = QApplication([])
widget = Widget()
widget.show()
sys.exit(app.exec_())
此时运行此程序,我们可以看到实现了加减乘除功能的界面。
因为Qt for Python具有跨平台的特点,我们将代码复制到Linux操作系统上,同样也可以运行。