PyQt5是由Riverbank Computing开发的一套绑定Qt5的应用程序框架,支持Pythono2.x和Python3.x版本。Qt 是一个跨平台应用程序和 UI 开发框架,使用 Qt 只需一次性开发应用程序,无须重新编写源代码,便可跨不同桌面和嵌入式操作系统部署这些应用程序。Qt需要用C++语言进行调用,Python在此基础上编写了调用Qt功能的库:Pyqt。因此,Pyqt的基本功能和Qt相同,作为Python语言的重要模块,拥有超过620个类和6000个函数及方法,支持Windows、linux、maxOS系统。
简单来说,pyqt使用的Qt的功能,但Qt功能需要C++来调用,为了方便开发用python写了一个API库,这就是pyqt。
Qt的核心就是信号–槽机制。信号是事件的触发信号,槽是事件执行的内容。比如设定按下一个按键后,桌面自动更换背景,按下按键就是信号,标志着事件启动,而更换背景就是槽,即事件的内容。
一个系统中可能会有多个信号、多个槽,只有把信号和槽联系起来,当信号响应时槽函数才会执行。比如有按键1、2、3、4四个按键信号,有更换背景、播放音乐、播放视频三个槽函数。将按键1与更换背景联系,将按键2与播放音乐联系,其他的都不联系。这样当按下按键1时变会更换背景,按下按键2时变会播放音乐,不会相互影响。而按键3、4没有联系槽函数,按下这两个按键什么都不会发生,同理播放视频也不会发生,除非将槽函数和某个按键联系起来。
一个信号可以对应多个槽函数,一个槽函数也可以对应多个信号。如将按键1与跟换背景、播放视频联系,则按下按键1后既会跟换背景也会播放视频,将更换背景与所有按键都联系起来,则不管按下那个按键,都会自动更换背景。
Qt可以直接用UI界面来设计各个部件,也可以用程序来设计各个部件。用UI比较直白、形象,但是对于比较精细的排版则不太方便,用程序来直接设计部件,可以定义各个部件的大小、排放位置,可以说各有千秋。新手小白直接用UI界面设计比较友好。
各个部件的大小、尺寸、颜色等等,信号–槽之间的连接,都可以通过UI或者程序来进行设计。
在UI界面设计后会自动生成一个ui文件,pyqt可以将ui文件转化为py文件,py文件中是用程序表达的各个部件,可以在UI文件中修改部件,也可以在py文件中用程序来修改部件,十分方便。
关于部件的介绍和pyqt的配置,网上有很多的资料,这里便不在赘述,贴出一些我参考的博客文章,希望对你有所帮助。
Pyqt5 +Pycahrm配置
Pyqt5使用系列教程
Pyqt窗口类型
pyqt的一个界面相当于一个类,默认自带有一个初始化方法。类内的各种方法,传入形参必须为self。
class MyWindow(QtWidgets.QMainWindow, ui):
def __init__(self):
super(MyWindow, self).__init__()
self.setupUi(self)
self.setWindowTitle("人脸识别")#设计界面名称
self.setWindowIcon(QtGui.QIcon("pre_data/logo.jpg")) # 设置程序的图标
self.timer_register = QtCore.QTimer(self)
self.timer_register.timeout.connect(self.status) #关联的时候 方法不能加括号
由于只是简单的图形界面设计,难度不大,多尝试多联系就可以掌握。UI设计是单个单个页面的设计,假设按下界面1的某个按键后所对应的事件为:界面1关闭,界面2打开。可以使界面2实例化为界面1的一个子变量。当信号响应时,主界面关闭(隐藏不显示),子界面显示。就完成了多窗口的切换问题。这种做法可能有些野路子,没有使用控件,不过设计比较简单。
def pushbutton(self): #确定输入按下
username = str(self.lineEdit.text())
password = str(self.lineEdit_2.text())
#提取输入的账号和密码
if username == "zhongbei":
if password == "666":#检测账号密码 如果正确
self.next = maininterface() #界面2实例化为界面1的变量
self.close() #界面1隐藏
self.next.show()#界面2 显示
else: #密码不正确 弹出提示框
my_button = QtWidgets.QMessageBox.information(self, '输入错误', u'请输入正确的密码')
else:#账号不正确 弹出提示框
my_button = QtWidgets.QMessageBox.information(self, '输入错误', u'请输入正确的账号')
利用label控件可以实时的显示视频。label.setPixmap语句可以将图片在label上显示,采用一个定时器,不断的刷新图片,就可以达到实时显示的效果。需要注意的时,定时器的时间不能太短,要留给计算机足够的反应时间,不然可能会卡顿或者黑屏。
show = frame #将图片frame 赋值给show变量
show = cv2.cvtColor(show, cv2.COLOR_BGR2RGB) #格式转换
self.showimage = QtGui.QImage(show.data, show.shape[1], show.shape[0], QtGui.QImage.Format_RGB888)#设计图片的大小 数据 格式
self.label.setPixmap(QtGui.QPixmap.fromImage(self.showimage)) #将图片用label显示
使用一个定时器与上述方法关联,启动定时器后就可以一直刷新图片。
最后在贴一下程序源码