【学习笔记】pyQt5学习笔记(1)

着手学习pyQt5,今天实现功能,读取图片,自适应label的大小并显示在界面上。

个人理解,pyQt5前端用QT designer设计简单的ui界面,初步规划除界面布局及组件,保存为ui文件后,通过命令:

pyuic5 -o xxxx.py xxxx.ui

将designer生成的ui界面转换为python代码。代码中显示各个组件的名称、尺寸、位置、布局等信息。

class Ui_Form(object):
    
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(500, 500)
        Form.setMinimumSize(QtCore.QSize(500, 500))
        Form.setMaximumSize(QtCore.QSize(500, 500))
        self.frame = QtWidgets.QFrame(Form)
        self.frame.setGeometry(QtCore.QRect(20, 20, 461, 46))
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.frame)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        
        self.btn_add_file = QtWidgets.QPushButton(self.frame)
        self.btn_add_file.setObjectName("btn_add_file")
        self.horizontalLayout_2.addWidget(self.btn_add_file)
        
        self.btn_open_cam = QtWidgets.QPushButton(self.frame)
        self.btn_open_cam.setObjectName("btn_open_cam")
        self.horizontalLayout_2.addWidget(self.btn_open_cam)
        
        self.btn_exit = QtWidgets.QPushButton(self.frame)
        self.btn_exit.setObjectName("btn_exit")
        self.horizontalLayout_2.addWidget(self.btn_exit)
        
        self.lab_img_show = QtWidgets.QLabel(Form)
        self.lab_img_show.setGeometry(QtCore.QRect(50, 80, 400, 400))
        self.lab_img_show.setMinimumSize(QtCore.QSize(400, 400))
        self.lab_img_show.setMaximumSize(QtCore.QSize(400, 400))
        self.lab_img_show.setObjectName("lab_img_show")

就是上面的代码所示,我的界面是一个没有菜单栏的普通weight窗口,同时含有三个水平分布的按钮(pushbutton),在三个按钮下方,是一个label。界面如下图所示:

由于最终目的是封装一个图像识别模块进行目标检测,因此界面窗口命名以及按钮柠命名都按最终效果来了。

学习阶段,实现的功能是点击“加载模型文件”按钮,可以浏览本地文件,加载.jpg格式的文件,显示在Lable中,并根据label的尺寸调整图片大小。

加载本地图片的关键语句为:QFileDialog.getOpenFileName,该函数的详细讲解放在完整代码的注释中。

另外一个关键语句即让图片自适应label大小,该语句为:setScaledContents(True)

个人目前的理解就是组件排排坐安顿好,后端将组件执行的动作与执行的动作挂钩(或者说信号与槽挂钩??)

最后附上完整代码:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'object_dect.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys

class Ui_Form(object):
    
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(500, 500)
        Form.setMinimumSize(QtCore.QSize(500, 500))
        Form.setMaximumSize(QtCore.QSize(500, 500))
        self.frame = QtWidgets.QFrame(Form)
        self.frame.setGeometry(QtCore.QRect(20, 20, 461, 46))
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.frame)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        
        self.btn_add_file = QtWidgets.QPushButton(self.frame)
        self.btn_add_file.setObjectName("btn_add_file")
        self.horizontalLayout_2.addWidget(self.btn_add_file)
        
        self.btn_open_cam = QtWidgets.QPushButton(self.frame)
        self.btn_open_cam.setObjectName("btn_open_cam")
        self.horizontalLayout_2.addWidget(self.btn_open_cam)
        
        self.btn_exit = QtWidgets.QPushButton(self.frame)
        self.btn_exit.setObjectName("btn_exit")
        self.horizontalLayout_2.addWidget(self.btn_exit)
        
        self.lab_img_show = QtWidgets.QLabel(Form)
        self.lab_img_show.setGeometry(QtCore.QRect(50, 80, 400, 400))
        self.lab_img_show.setMinimumSize(QtCore.QSize(400, 400))
        self.lab_img_show.setMaximumSize(QtCore.QSize(400, 400))
        self.lab_img_show.setObjectName("lab_img_show")


        
        self.retranslateUi(Form)
        # 这里将按钮和定义的动作相连,通过click信号连接openfile槽?
        self.btn_add_file.clicked.connect(self.openfile)
        # 这里是将btn_exit按钮和Form窗口相连,点击按钮发送关闭窗口命令
        self.btn_exit.clicked.connect(Form.close)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "目标检测"))
        self.btn_add_file.setText(_translate("Form", "加载模型文件"))
        self.btn_open_cam.setText(_translate("Form", "打开摄像头"))
        self.btn_exit.setText(_translate("Form", "退出"))
        self.lab_img_show.setText(_translate("Form", "TextLabel"))

## 这里定义了打开文件的事件,使用QFileDialog.getOpenFileName方法打开单个文件
## 此外,QFileDialog.getOpenFileNames可以打开多个文件
##  QFileDialog.getExistingDirectory()可以打开文件夹
## 值得注意的是,getOpenFileName(parent,caption,dir,filter)中的参数定义
## parent指定父组件,个人理解:与谁连接就写谁;caption选取文件时对话框的标题;dir打开的默认目录;filter文件后缀名过滤器
## 这里测试加载一张图片
    def openfile(self):
        # 经测试,若没有_,openfile_name返回类型为一个元组,返回:('/home/kanghao/QT_learning/python.jpg', 'image files(*.jpg)')
        # 通过_,openfile_name返回str类型,/home/kanghao/QT_learning/python.jpg
        # 将该变量写入QPixmap()中,最终通过setPixmap方法通过lable显示图片
        openfile_name, _ = QFileDialog.getOpenFileName(self.btn_add_file,'选择文件','/home/kanghao/','image files(*.jpg)')
        # ~ print(type(openfile_name))
        # ~ print(openfile_name)
        self.lab_img_show.setPixmap(QPixmap(openfile_name))
        # 让图片自适应lable大小
        self.lab_img_show.setScaledContents(True)
## 用于显示ui界面的命令
if __name__ == "__main__":
	app = QtWidgets.QApplication(sys.argv)
	MainWindow = QtWidgets.QMainWindow()
	ui = Ui_Form()
	ui.setupUi(MainWindow)
	MainWindow.show()
	sys.exit(app.exec_())

刚开始学习,如有错误恳请指出。

实际演示效果如下:

加载图片后:

猜你喜欢

转载自blog.csdn.net/yourgreatfather/article/details/84400310
今日推荐