Pyqt5:使用Qlabel标签进行视频播放
Posted 牧子川
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pyqt5:使用Qlabel标签进行视频播放相关的知识,希望对你有一定的参考价值。
目录
Pyqt5安装并配置到pycharm方法:完全弄懂如何用pycharm安装pyqt5及其相关配置
一、简介
QLabel是界面中的标签类,继承自QFrame类,提供文本和图像的显示,是一种展示控件。
QLabel对象可以显示不可编辑的文本或图片,可以放置一个GIF动画,还可以被用作提示标记为其他控件。
纯文本、链接或富文本也可以显示在标签上。
二、基本用法
2.1 QLabel控件
setAlignment():按固定值方式对齐文本,有以下对齐方式:
Qt.AlignLeft(水平方向靠左对齐) 、Qt.AlignRight(水平方向靠右对齐)、Qt.AlignCenter(水平方向居中对齐)、Qt.AlignJustify(水平方向调整间距两端对齐)、Qt.AlignTop(垂直方向靠上对齐)、Qt.AlignBottom(垂直方向靠下对齐)、Qt.AlignVCenter(垂直方向居中对齐)
setIndent():设置文本缩进
setPixmap():设置QLabel为一个Pixmap图片
text():获得QLabel的文本内容
setText():设置QLabel的文本内容
selectedText():返回所选择的字符
setBuddy():设置伙伴关系
setWordWrap():设置是否允许换行
2.2 QLabel常用的信号(事件)
1.linkHovered:当鼠标指针滑过标签中嵌入的超链接时,需要用槽函数与这个信号进行绑定
2.linkActivated:当单击标签中嵌入的超链接,希望在新窗口中打开这个超链接时,setOpenExternalLinks特性必须设置为true
三、QLabel播放视频
使用QLabel播放视频文件的重点就在定时器QTimer
当程序中需要显示时间时或者需要在程序中周期性地进行某项操作,就会用到定时器
3.1 QTimer
导入QTimer模块
from PyQt5.QtCore import QTimer
初始化
self.timer_camera = QTimer()
计时并启动
self.timer_camera.start(1000) # 1000ms == 1s
self.timer_camera.timeout.connect(self.openFrame) # 连接槽函数openFrame
注意:当QTimer的父对象被销毁时,它也会被自动销毁。
3.2 代码
UI界面:
python程序:
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.uic import loadUiType
import cv2
import sys
vedio_ui, _ = loadUiType('./UI/vedio.ui')
class VedioGui(QMainWindow, vedio_ui):
# 定义构造方法
def __init__(self):
QMainWindow.__init__(self)
self.setupUi(self)
self.timer_camera = QTimer()
self.handle_buttons()
self.open_vedio()
self.result_label.setText("按下start播放视频")
# 所有Button的消息与槽的通信
def handle_buttons(self):
self.btn_Start.clicked.connect(self.Btn_Start)
self.btn_Stop.clicked.connect(self.Btn_Stop)
def Btn_Start(self):
# 定时器开启,每隔一段时间,读取一帧
self.timer_camera.start(100)
self.timer_camera.timeout.connect(self.OpenFrame)
self.result_label.setText("正在播放")
def Btn_Stop(self):
# self.cap.release()
self.timer_camera.stop()
self.result_label.setText("停止播放,按下start再次播放")
def open_vedio(self):
"""选取视频文件"""
# 这里以mp4和avi视频播放为例
openfile_name = QFileDialog.getOpenFileName(self, 'chose files', '', 'Image files(*.mp4 *.avi)') # 打开文件选择框选择文件
self.file_name = openfile_name[0] # 获取图片名称
# 得到文件后缀名 需要根据情况进行修改
suffix = self.file_name.split("/")[-1][self.file_name.split("/")[-1].index(".") + 1:]
# print(self.file_name, suffix)
if self.file_name == '':
pass
elif suffix == "mp4" or suffix == "avi":
self.cap = cv2.VideoCapture(self.file_name)
def OpenFrame(self):
ret, image = self.cap.read()
if ret:
if len(image.shape) == 3:
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
vedio_img = QImage(image.data, image.shape[1], image.shape[0], QImage.Format_RGB888)
elif len(image.shape) == 1:
vedio_img = QImage(image.data, image.shape[1], image.shape[0], QImage.Format_Indexed8)
else:
vedio_img = QImage(image.data, image.shape[1], image.shape[0], QImage.Format_RGB888)
self.vedio_label.setPixmap(QPixmap(vedio_img))
self.vedio_label.setScaledContents(True) # 自适应窗口
else:
self.cap.release()
self.timer_camera.stop()
# 界面关闭事件,询问用户是否关闭
def closeEvent(self, event):
reply = QMessageBox.question(self, '退出', "是否要退出该界面?",
QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
self.close()
event.accept()
else:
event.ignore()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = VedioGui()
window.show()
sys.exit(app.exec_())
视频播放成功显示:
注:视频播放没有声音
PyQt/Qt:如何在 Qlabel 小部件中拉伸图像?
【中文标题】PyQt/Qt:如何在 Qlabel 小部件中拉伸图像?【英文标题】:PyQt/Qt: How to stretch an image in Qlabel widget? 【发布时间】:2012-06-10 12:40:04 【问题描述】:我想在我的应用中显示一张图片。我使用 QtDesigner 设计 UI,然后使用 pyqt 进行编码。问题是将显示的图像大于 UI 上的小部件大小。我参考官方demo: QT - Widget Image Viewer Demo
添加imagelabel和scrollArea,代码如下:
---- UI init ----
self.label = QtGui.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(40, 140, 361, 511))
self.label.setSizePolicy(QtGui.QSizePolicy.Preferred,QtGui.QSizePolicy.Preferred)
self.label.setObjectName(_fromUtf8("label"))
self.scrollArea = QtGui.QScrollArea(self.centralwidget)
self.scrollArea.setGeometry(QtCore.QRect(40, 140, 361, 511))
self.scrollArea.setWidget(self.label)
self.scrollArea.setObjectName(_fromUtf8("scrollArea"))
---- function ----
filename = "./Penguins.jpg"
image = QtGui.QImage(filename)
pp = QtGui.QPixmap.fromImage(image)
lbl = QtGui.QLabel(self.label)
lbl.setPixmap(pp)
self.scrollArea.setWidgetResizable(True)
lbl.show()
但它不会拉伸图像,甚至没有出现滚动条!
【问题讨论】:
【参考方案1】:QLabel::setScaledContents 的默认实现对我不起作用,因为当图像大于标签时,它不允许我保持纵横比 最大尺寸。
如果需要,这个小助手会缩小图像以适应标签的最大尺寸(但不是放大),始终保持纵横比:
/**
* Fill a QLabel widget with an image file, respecting the widget's maximum sizes,
* while scaling the image down if needed (but not up), and keeping the aspect ratio
* Returns false if image loading failed
****************************************************************************/
static bool SetLabelImage(QLabel *label, QString imageFileName)
QPixmap pixmap(imageFileName);
if (pixmap.isNull()) return false;
int w = std::min(pixmap.width(), label->maximumWidth());
int h = std::min(pixmap.height(), label->maximumHeight());
pixmap = pixmap.scaled(QSize(w, h), Qt::KeepAspectRatio, Qt::SmoothTransformation);
label->setPixmap(pixmap);
return true;
【讨论】:
你知道我如何在 Python 中实现这个吗? @Vitto @Petrucio 提供的代码可以很容易地用 Python 重写。您只需查看 PyQt 文档,以免错过某些包名称等。std::min
和 std::max
也可以替换为具有相同功能的 Python 内置函数。【参考方案2】:
您需要致电self.label.setScaledContents(true);
。这样QLabel
会将自身调整为像素图/图像的大小,并且滚动条将变得可见。看到这个documentation。
【讨论】:
我在我的代码中添加了“self.label.setScaledContents(true)”,但它仍然不起作用!您可以在上面看到我的代码,我将滚动区域的大小设置为与标签的大小相同。是不是有问题? 我解决了!通过调试,我发现'lbl = QtGui.QLabel(self.label)' 出错了。【参考方案3】:我不使用 PyQt,但 QtPixmap 控件具有 scaled() 函数。您可以在放入标签之前调整图像大小:
缩放() scaledToHeight() scaledToWidth()这是我在 C++ 中用于将图像大小调整为 QLabel 大小的示例代码:
imatge.load("sprite.png");
QPixmap imatge2 = imatge.scaled(ui->label->width(),ui->label->height());
【讨论】:
如何设置标签的大小和滚动区域的大小?您可以在上面看到我的代码,我将滚动区域的大小设置为与标签的大小相同。是不是有问题? 我解决了!通过调试,我发现'lbl = QtGui.QLabel(self.label)' 出错了。以上是关于Pyqt5:使用Qlabel标签进行视频播放的主要内容,如果未能解决你的问题,请参考以下文章