最近两天要实现显示图像全屏显示,花了一天时间终于解决了,其实也不是很难,主要就是关于PyQt5相关部分网上资料太少了,而书上也都是很基础的东西,我自己也走了不少弯路,所以用这篇文章记录一下思路和做法。
label标签的全屏展示
我是要实现七个label里的图片双击后均能实现全屏而且要保证不能模糊像素,所以比较麻烦,而首先要解决的就是如何将label置为*窗口进行展示,然后利用showfullScreen方法进行全屏。关于这一块的介绍请参考以下篇文章:
QT 子窗口全屏化和退出全屏的功能实现_猫瑾的博客-CSDN博客_qt 子窗口全屏
QT中关于窗口全屏显示与退出全屏的实现_Tengjie_Yan的博客-CSDN博客_qt实现全屏
上面尽管是从Qt角度进行讲解,但方法和本质都是一样的,借鉴以上思路我实现了如下界面:
因为是利用鼠标双击事件形成的,而且是多个的label控件,所以我在这里重构了label类
class Label(QtWidgets.QLabel):
sinh = QtCore.pyqtSignal(int)
sinw = QtCore.pyqtSignal(int)
def __init__(self,labelsuofang):
super(Label,self).__init__()
self.flag = True
self.setMaximumSize(400,400) #锁死label的大小,防止它由于paintevent发生难以控制的缩放
self.setMinimumSize(400,400)
def mouseDoubleClickEvent(self, event):
self.w = self.width() #获得label自身的宽高
self.h = self.height()
if self.flag == True:
print(1)
self.setWindowFlags(QtCore.Qt.Window) #使得label位于*别的窗口
self.showFullScreen() #全屏显示
self.flag = False
else:
print(2)
self.setWindowFlags(QtCore.Qt.SubWindow) #使得label回到子窗口级别
self.resize(self.w,self.h) #使得label宽高恢复原样
self.showNormal() #恢复label原本大小
self.flag = True
然后再写好Ui类后(也就是窗口布局)作为一个模块,再导入主类里,以初始化窗口界面
from PyQt5 import QtCore, QtGui, QtWidgets
from backgroud import Ui_labelsuofang
from backgroud import Ui_labelsuofang
# from background2 import Ui_labelsuofang
# from background import Ui_Form
class Try(QtWidgets.QWidget):
def __init__(self):
super(Try,self).__init__()
self.ui = Ui_labelsuofang()
self.ui.setupUi(self)
之后便是另一个关键了,由于每次窗口全屏,放大的是label标签,插入的图片不会发生变化,所以我在这里重写paintEvent用以让图片随着label的改变而改变,但是由于某种未知的原因(极有可能是paintEvent的机制)致使全屏恢复时不能回到之前的界面大小,因此我直接设置了label的最大和最小值,直接锁住label,使得label除了全屏状态就只能维持一个大小,这种状态虽然有些不太满意,但也实现了双击全屏的功能并且能够恢复原样。
下面则是painevent的实现代码:
def paintEvent(self,event): #重写绘图事件,每个label对应的图片利用flag将图片合理返回原样
if self.ui.label.flag == False:
self.ui.label.setPixmap(self.img.scaled(int(self.ui.label.width()),int(self.ui.label.height()),QtCore.Qt.KeepAspectRatio))
else:
self.ui.label.setPixmap(self.img.scaled(self.labelw1,self.labelh1,QtCore.Qt.KeepAspectRatio))
if self.ui.label_2.flag == False:
self.ui.label_2.setPixmap(self.img.scaled(int(self.ui.label_2.width()),int(self.ui.label_2.height()),QtCore.Qt.KeepAspectRatio))
else:
self.ui.label_2.setPixmap(self.img.scaled(self.labelw_2,self.labelh_2,QtCore.Qt.KeepAspectRatio))
if self.ui.label_3.flag == False:
self.ui.label_3.setPixmap(self.img.scaled(int(self.ui.label_3.width()),int(self.ui.label_3.height()),QtCore.Qt.KeepAspectRatio))
else:
self.ui.label_3.setPixmap(self.img.scaled(self.labelw_3,self.labelh_3,QtCore.Qt.KeepAspectRatio))
if self.ui.label_4.flag == False:
self.ui.label_4.setPixmap(self.img.scaled(int(self.ui.label_4.width()),int(self.ui.label_4.height()),QtCore.Qt.KeepAspectRatio))
else:
self.ui.label_4.setPixmap(self.img.scaled(self.labelw_4,self.labelh_4,QtCore.Qt.KeepAspectRatio))