通过双击实现PyQt5里多个QLabel的全屏显示

最近两天要实现显示图像全屏显示,花了一天时间终于解决了,其实也不是很难,主要就是关于PyQt5相关部分网上资料太少了,而书上也都是很基础的东西,我自己也走了不少弯路,所以用这篇文章记录一下思路和做法。

label标签的全屏展示

我是要实现七个label里的图片双击后均能实现全屏而且要保证不能模糊像素,所以比较麻烦,而首先要解决的就是如何将label置为*窗口进行展示,然后利用showfullScreen方法进行全屏。关于这一块的介绍请参考以下篇文章:

QT 子窗口全屏化和退出全屏的功能实现_猫瑾的博客-CSDN博客_qt 子窗口全屏

QT中关于窗口全屏显示与退出全屏的实现_Tengjie_Yan的博客-CSDN博客_qt实现全屏

上面尽管是从Qt角度进行讲解,但方法和本质都是一样的,借鉴以上思路我实现了如下界面:

通过双击实现PyQt5里多个QLabel的全屏显示

 因为是利用鼠标双击事件形成的,而且是多个的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))

 

通过双击实现PyQt5里多个QLabel的全屏显示

上一篇:「django2」macos系统下安装及创建工程


下一篇:pyqt5实战之幻彩大蛇(贪吃蛇)-1