摘要:
PyQt5学习入门-1简单对整个流程进行介绍。下面的这篇文章会做一个简单的计算器框架。最终实现的界面效果如下
1.本章的目的
写这篇文章需要能够让读者学习到以下几点:
1.如何使用Text Browser(可以理解为文本的输出框)
2.如何使用按键(pushButton),以及如何通过鼠标来触发任务
3.如何进行布局
2.拖拽组件
打开Qt designer后,我们首先新建一个widget。
新建一个widget后,我们在工具盒中拖拽我们需要用到的组件。
Buttons中的Push Button
Display Widgets中的Text Browser
然后整整齐齐的放在子窗口上,如下图所示。
3.编辑信号线
如何让每个按键在按下时触发一个任务呢?这里涉及到Qt里面的两个概念。
一个是所谓的“信号”,另一个是”槽“。
信号简单的理解其实就时一种什么样的行为,是单击了按键,还是双击按键,是释放按键,还是悬浮在按键上?
槽简单的理解其实就是做出什么样的反应(本质是一个函数),即有了信号之后,需要做什么东西。
在Qt Designer中点击工具栏(注意不是工具盒)中的这个图标。
点击这个图标后,就进入了编辑信号/槽的状态,这个时候我们把鼠标放在放在组件上会有红色选中状态。
我们在Clear按键上,向左拉出一条信号/槽线。如下图
之后会弹出一个窗口,如下图
蓝色的框框就是选择信号的地方,红色的框框就是选择槽的地方。
先来看看信号选择。pushButton的触发方式有clicked()、clicked(bool)、pressed()、released()、toggled(bool)。
这几个信号有很大的区别的(大家可以自行选择不同的方式然后实验一下)
再来看看槽选择,槽选择的时候其实就时指定一个函数名。这里我点编辑,然后在弹出的窗口中点击新建一个函数名为clear的函数。确定后有:
最后,我们把选择的信号方式和对应的槽连接,连接的方式就时点击对应的信号和槽,然后按ok即可。
可以看到,按键Clear已经有了一个信号/槽的线,在动作编辑器里也有相应的信息。
同样地,其他按键也有相应的信号/槽线。编辑完成后按键盘上的Esc退出编辑信号/槽模式。
对其他按键都添加后,动作编辑器如下:
这里,我们可能会困惑,那我们添加了这么多的槽(函数),那我们需要在哪里编写这些函数呢?下面就是教大家如何编写这些函数。
3.保存ui,转换成.py文件
我们把目前的设计的ui进行保存,保存的名为test.ui,保存完后进行 .ui -> .py的转换
pyuic5 -o test.py test.ui
在这里,我们把生成的test.py打开来看看,拉到最后,我们可以这段程序:
self.pushButton_16.clicked.connect(Form.clear) self.pushButton_17.clicked.connect(Form.equal) self.pushButton_2.clicked.connect(Form.button_1) self.pushButton_3.clicked.connect(Form.button_2) self.pushButton_4.clicked.connect(Form.button_3) self.pushButton_5.clicked.connect(Form.button_4) self.pushButton_6.clicked.connect(Form.button_5) self.pushButton_7.clicked.connect(Form.button_6) self.pushButton_8.clicked.connect(Form.button_7) self.pushButton_9.clicked.connect(Form.button_8) self.pushButton_10.clicked.connect(Form.button_9) self.pushButton_15.clicked.connect(Form.button_div) self.pushButton_14.clicked.connect(Form.button_mul) self.pushButton_13.clicked.connect(Form.button_sub) self.pushButton_12.clicked.connect(Form.button_add) self.pushButton_11.clicked.connect(Form.button_add) self.pushButton.clicked.connect(Form.button_0)
其实,这里程序的意思就是我们刚刚在Qt Desinger里面编辑的信号/槽的线。所以,我们也可以完全自己用程序来写。
另外,我们发现我们的连接的槽(函数)是Form的属性。而Form是调用方法setupUi始化时传入的一个参数。通过这点我们就可以知道,这些槽(函数)应该编写在哪个类里面。
4.编写主文件。
在这里,我们需要编写一个另外一个程序,其主体的框架和第一篇文章介绍的类似,不过有一些细节上的不同。下面一一说明。
from PyQt5 import QtWidgets from test import Ui_Form class MyWindow(QtWidgets.QWidget,Ui_Form): def __init__(self): super(MyWindow,self).__init__() self.setupUi(self) if __name__=="__main__": import sys app=QtWidgets.QApplication(sys.argv) myshow=MyWindow() myshow.show() sys.exit(app.exec_())
对比第一篇文章的程序,我们发现其实就几个地方不一样。
from test import Ui_Form
所生成的test.py里面的类名为Ui_Form(这个类名可以改为自己取的任意名字),因此此处当然不同。
class MyWindows(QtWidgets.QWidge,Ui_MainWindow):
由于我们所创建的是widget(子窗口)所以不再继承于QtWidgets.QMainWindow,而是QtWidgets.QWidget。
其他的地方是一样的。
下面,我们尝试一下运行这个程序(把这段程序名字保存成main.py)
这个时候,程序报错说
错误告诉我们,我们还未编写槽函数。而且也告诉了我们需要在哪里编写这个槽函数,需要在MyWindow这个类里面编写。
在MyWindow里面加入各个槽函数,具体如下:
class MyWindow(QtWidgets.QWidget,Ui_Form): def __init__(self): super(MyWindow,self).__init__() self.setupUi(self) def button_0(self): self.textBrowser.append("0") def button_1(self): self.textBrowser.append("1") def button_2(self): self.textBrowser.append("2") def button_3(self): self.textBrowser.append("3") def button_4(self): self.textBrowser.append("4") def button_5(self): self.textBrowser.append("5") def button_6(self): self.textBrowser.append("6") def button_7(self): self.textBrowser.append("7") def button_8(self): self.textBrowser.append("8") def button_9(self): self.textBrowser.append("9") def button_add(self): self.textBrowser.append("+") def button_sub(self): self.textBrowser.append("-") def button_mul(self): self.textBrowser.append("*") def button_div(self): self.textBrowser.append("/") def button_point(self): self.textBrowser.append(".") def clear(self): self.textBrowser.append("清除") def equal(self): self.textBrowser.append("=")
对比上面的MyWindow就能够发现,其实就是多了这么槽函数。
注意:这里你可能对self.textBrowser.appned感到困惑,请暂时忽略,下面会说明,此处你只需要要知道的是其意思是在textBrowser中输出一段文本。
然后,我们运行main.py,就会有窗口:
我们尝试点击上面的按键,比如点击清除有如下:
在文本输出框中输出了清除的字样。
ok,信号/槽的任务就完成了,在进行按键后我们具体想做什么东西就可以直接在槽函数里面编写了。
这里需要注意的是,其他所有的组件的信号/槽也是和按键一样的设置。