pyqt界面制作进阶教程
夜已深,人未眠,好久不来写东西了,虽然前面写了很多篇,质量都不高,自己心性也不好,这里做了一点,那里做了一点,都不是很精通,但是自己没事就在钻研,就当是活动自己的脑筋了吧。今天将PYQT界面制作相关的心得体会写下来,放在这里,等自己忘了也不用重头再来了。pyqt制作界面一些很基础的内容网上有很多的教程可供参考,我就不画蛇添足了。我想写的是有关信号与槽以及界面、界面驱动文件、核心算法分离相关的东西。
1、信号与槽的概念
我比较笨,一直没明白信号和槽究竟是什么东西,他们之间是怎么样联系在一起的。通过进一步的研究发现,信号其实就是发送者发送的信号,例如按了按钮,会发出一个信号,勾选复选框,会发出一个信号;槽就是接受者接受到信号以后做出的反应,按了按钮会执行一定的程序,执行程序的动作就是槽。在设计界面时,一般采用QT Designer来布局,在这里就可以通过信号和槽来设计界面与核心算法的通信函数。新建一个bottom控件后,按住F4或者在编辑中选择edit signals/slots进入信号槽定义工作模式,选中按钮并按住左键下拉就生成了一个信号槽。弹出的配置窗口左侧是信号,右侧是槽,当我们单击(clicked)就会发送信号。选中clicked()之后,单击右侧的编辑,进入槽编辑界面,单击 +号生成一个槽函数,按照自己的需要修改这个槽函数名。有个小BUG,改了以后没法确认,如果直接退出,发现没有改过来,此时只需要再次单击+,就可以越过这个bug。之后选择需要的信号以及槽,确认之后便新建好了一个信号与槽。
新建好以后,会出现下图所示的界面,注意下图底部的发送者-信号-接受者-槽的定义,这样就很容易理解信号和槽究竟是什么了。
转换为UI文件(界面文件)
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(736, 581)
self.pushButton = QtWidgets.QPushButton(Form)
self.pushButton.setGeometry(QtCore.QRect(240, 280, 93, 28))
self.pushButton.setObjectName("pushButton")
self.retranslateUi(Form)
self.pushButton.clicked.connect(Form.first_click) #这里就是我们新建的信号与槽,我们在类体内可以新建一个函数,名字叫first_click
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.pushButton.setText(_translate("Form", "PushButton"))
def first_click(self, Form) #这是我们新建的,可以用来与核心算法通信的函数
2、主界面文件、界面驱动文件、核心算法的分离
界面文件、界面驱动文件、核心算法一般不放在一个文件中,否则不便于更新界面以及代码维护。
2.1主界面文件
上述的主界面文件可以封装成一个.py 文件,界面驱动程序中可以直接用from uiname.py import *来将界面文件全部导入。
2.2界面驱动文件
这个是执行文件,在运行界面的时候,运行这个脚本即可。
import sys
from uiname.py import *
from PyQt5 import QtWidgets
if __name__=='__main__': #如果复制的话注意缩进,文本编辑器可能打乱了
app=QtWidgets.QApplication(sys.argv)
Form=QtWidgets.QWidget()
ui=Ui_Form() #这里要注意类型
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
2.3 核心算法文件
核心算法中的相关函数在界面文件中会被调用,因此,需要在UI文件中加入 from 核心算法名.py import *,这样就能在界面文件中使用相应的函数名了
好了,最近的心得体会就这些了,后续我将给大家介绍python/c++混合编程 、c++调用Eigen库做矩阵运算相关的内容。