想当初做QT的第一个程序就是写的是加法器
所以,做PyQT5的时候不意外的选择 做一个加法器
其实,PyQt5中最困难的信号与槽的机制,我基本上很久前就理解了,所以,在这也就比较容易上手。
后面有写好的代码(如果不是软件自己生成的部分,我会写了好注释的)
pyqt5安装有很多的坑。
通过这个网页,就可以保证解决你安装的pyqt5的坑,建议复制(这个链接里面还有一个超链接,辅助使用觉得可以帮助安装,否则可以给我发私信,这是一个CSDN博客,我写的)
话是这么说,但是做这个第一个程序的时候还是遇到了很多问题的。
不然的话,我也不会专门写一篇文章。
写这篇文章一方面,蹭着自己刚刚熟悉好了这个东西,巩固一下;另一方面,自己也知道这个过程有多难。网上的教程基本上都是PyQT4的,这两者有很大变化,直接看pyqt4的文档很难上手
在这里,我会建立一个pyQt5的文库,如果遇到有志同道合的朋友,可以往这个文库中发pyQt5的文章。要求不多,但一定是要pyQt5上能够运行的,算是给pyQt5做了比较好的交流环境吧。
信号与槽的机制,其实非常简单
- 信号端,负责发信号
- 槽,负责接受信号,并做出反应
没了,就这么简单。
这个就是QT的美所在,网上那么多长片大论其实大部分都是废话(当然啦,拿来读一下涨涨见识也好)
敲黑板: 对于以前熟悉QT的老哥们,也要听
pyqt5中的connect函数,有两种连结方法
- 直接对于某个元素的信号函数做一个connect
- 这点很有趣,我们拿一个button举例
self.button.clicked这个就是button最典型的信号函数。也就是最常使用的点击函数。
在pyqt中,可以使用self.button.clicked.connect(lambda: self.fun())
这样的方式来构建联系。
意思是:在点击这名叫做button的东西之后,就会触发fun函数
有人可能就问了:为什么这里会有一个lambda呢?
答: 是这样的,在pyqt中,采用了,一个pyqtSlot的函数。它在PyQt5.QtCore这个类中。 这个函数是一个装饰函数,没错就是会把某一个函数装饰一下,变成一个全新的槽函数。(这也是我们马上就要讲的第二个方法)。而这个新的槽函数,是给这个connect这个函数使用的。一般来说,都是先从这个传递这个函数抛开最外层的槽函数。用这个槽函数的返回的内部的函数。写到这,大家有没想到QT C++的里面是不是在connect中使用了SOLT()这个外壳来封装起来某个函数的对吧。其实,看这篇文章没准还加深了你对Python的装饰器的理解,哈哈哈。
所以,很明显,如果你传进去没有加lambda的话,那你点击这个button之后,估计就是去Call(调用函数)你的这个self.fun的返回值了。
-
@pyqtSlot()
放到槽函数的头部(就是正常的装饰函数
的放法啦!)
这样也是一样的。
将这个东西,放到头部之后。我们可以理解,现在你手头上就有了一个封装好的槽函数了。
self.connect(self.button, QtCore.SIGNAL('clicked()'), self.fun)
这就是一个实例。(如果你import了QtCore之后)
看代码部分,非常简单:
- 第一部分: import部分(其实是我忘了哪几个是系统自动生成的了。我用了designer的。但是sys是一定要带上的,是为了使用那个sys来结束进程(不然你把这个可视化的软件关的掉么?))
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5 import QtCore, QtGui, QtWidgets
- 第二部分: Class类中函数的修改。(其实是可以在designer中自己手动添加的,但是很明显,这个手动添加这个连结部分是很慢的。熟悉之后,手动写是很快的)
- 在加了一个连结的connect
self.pushButton.clicked.connect(lambda: self.add())
# 信号与槽的连结方式,记得,clicked没有括号,但是add一定要有
- 加了一个函数add()
def add(self):
A = float(self.lineEdit.text())
B = float(self.lineEdit_2.text())
self.lineEdit_3.setText(str(A + B))
pass
有人马上就会问了:那个connect加哪呀?
回答其实很简单:你把这个放在那个系统main函数会自动调用的函数中不就好了?
所以就需要看下面的main函数部分
- main函数部分:
对于部分大的程序,这个部分是可以放到一个新的py文件中,这样就更加维护了整个代码的结构性和安全性。
但是下面的这段代码是一定要有的
# 自己添加了的main函数代码部分
if __name__ == '__main__':
app = QApplication(sys.argv)
# 系统调用参数给这个类,生成一个应用类
MainWindow = QMainWindow()
# 生成一个主框口。这个不可以少。
ui = Ui_MainWindow()
# 生成一个类,我在designer中生成的就是这个类
ui.setupUi(MainWindow)
# 调用这个类的函数并传一个主窗口给这个函数中的函数做父类
# 这样就将某些部件放到了这个框口中
MainWindow.show()
# 将这个窗口显示出来
sys.exit(app.exec_())
# 如果这个应用关闭的时候,也同样调用sys将整个进程给关掉。
下面的代码,如果你们电脑上有这些库的话,就可以直接运行了。
生成的结果就是一个加法器
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'add.ui' # # Created by: PyQt5 UI code generator 5.10 # import sys from PyQt5.QtWidgets import QMainWindow, QApplication from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(919, 219) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.lineEdit = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit.setGeometry(QtCore.QRect(30, 50, 231, 61)) self.lineEdit.setObjectName("lineEdit") self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_2.setGeometry(QtCore.QRect(340, 50, 231, 61)) self.lineEdit_2.setObjectName("lineEdit_2") self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_3.setGeometry(QtCore.QRect(670, 50, 231, 61)) self.lineEdit_3.setObjectName("lineEdit_3") self.label_2 = QtWidgets.QLabel(self.centralwidget) self.label_2.setGeometry(QtCore.QRect(280, 30, 48, 111)) self.label_2.setObjectName("label_2") self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(580, 50, 81, 61)) self.pushButton.setStyleSheet("font: 28pt \"Agency FB\";") self.pushButton.setObjectName("pushButton") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 919, 30)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.label_2.setText(_translate("MainWindow", "
+
")) self.pushButton.setText(_translate("MainWindow", "=")) self.pushButton.clicked.connect(lambda: self.add()) # 信号与槽的连结方式,记得,clicked没有括号,但是add一定要有 def add(self): A = float(self.lineEdit.text()) B = float(self.lineEdit_2.text()) self.lineEdit_3.setText(str(A + B)) pass # 自己添加了的main函数代码部分 if __name__ == '__main__': app = QApplication(sys.argv) MainWindow = QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() sys.exit(app.exec_()) pass