初学习使用了PySide2 ,其中遇到了许多的问题,但是在不断努力之中最终还是解决了。来张界面效果图。
其中按键比较多, 按键“打开多个文件”“打开单个文件”就是为了学习读取文件添加的没有实际功能,该按键返回文件路径。
1、Qt界面制作
包含 QLabel QPushButton 上面的其实是一个放大了的Label标签,名字为空,下面为按键。
2 、图像的读取转换
2.1 文件读取
FileDialog = QFileDialog(self.pushButton_2)
# 设置可以打开任何文件
FileDialog.setFileMode(QFileDialog.AnyFile)
# 文件过滤
Filter = "(*.jpg,*.png,*.jpeg,*.bmp,*.gif)|*.jgp;*.png;*.jpeg;*.bmp;*.gif|All files(*.*)|*.*"
image_file, _ = FileDialog.getOpenFileName(self.pushButton_2,'open file','./','Image files (*.jpg *.gif *.png *.jpeg)') # 选择目录,返回选中的路径 'Image files (*.jpg *.gif *.png *.jpeg)'
# 判断是否正确打开文件
if not image_file:
QMessageBox.warning(self.pushButton_2, "警告", "文件错误或打开文件失败!", QMessageBox.Yes)
return
print("读入文件成功")
print(image_file) # 默认打开当前路径 输出文件路径
2.2 图像转换
PySide2 中QLabel类可以显示文字和图片。利用QFileDialog.getOpenFileName()类读取文件路径,在利于cv2把视频按帧读取,本来想利于cv2播放,但是速度有点快,最后选择了QLabel加Timer播放。QLabel显示的格式必须是Qimage,但是用cv2读取的帧格式是numpy array,必须把它转换成为Qimage。
# 读取一帧
success, frame = self.cap.read()
if success:
# Mat格式图像转Qt中图像的方法
show = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
showImage = QImage(show.data, show.shape[1], show.shape[0], QImage.Format_RGB888)
gui.label.setPixmap(QPixmap.fromImage(showImage))
gui.label.setScaledContents(True) # 让图片自适应 label 大小
3 、主函数代码
本来想使用动态加载UI文件,但是后来发现,如果在一个类里面使用起来还是比较方便的,如果在另一个里面调用效果不是太好,所有直接选择了加载py文件。
import sys
from PySide2.QtWidgets import QApplication, QMessageBox,QFileDialog,QMainWindow
from PySide2.QtUiTools import QUiLoader
from PySide2.QtCore import Qt,QDir, QTimer
from PySide2.QtGui import QPixmap,QImage
from UI_QLabel import Ui_mainWindow
import cv2
class LoginGUI(QMainWindow, Ui_mainWindow):
def __init__(self):
super(LoginGUI, self).__init__() #调用父类
self.setupUi(self)
# super().__init__()
# # 从文件中加载UI定义
# self.ui = QUiLoader().load('UI_QLabel.ui')
# 打开文件类型,用于类的定义
self.f_type = 0
def window_init(self):
# label 风格设置
self.label.setStyleSheet('''background: rgba(177, 177, 177, 0.8);
font-family: YouYuan;
font-size: 12pt;
color: white;
''')
self.label.setAlignment(Qt.AlignCenter) # 设置字体居中现实
self.label.setText("Moonbaem 小先生") # 默认显示文字
# self.ui.label.setPixmap("login.jpg") ##输入为图片路径,比如当前文件内的logo.png图片
# self.ui.label.setFixedSize(200, 200) # 设置显示固定尺寸,可以根据图片的像素长宽来设置
# self.ui.label.setScaledContents(True) # 让图片自适应 label 大小
self.pushButton.</