需求
要实现加载界面我们的需求有:首先GIF的呈现,加载窗口的呈现,主窗口的虚化及不可操作,下面我们一一实现上面的需求。
GIF的呈现
QLabel类是Qt中一种用来呈现普通文本,HTML文本和静态图片的容器,要实现标签呈现动图需要用到QLabel.setMovie(self,QMovie)函数,其中QMovie是Qt中用来实现GIF图片动起来的容器
下面我们用代码来说明上述过程
# 加载动画画面
self.loading_gif = QMovie('./img/loading_b.gif') # 加载动图
self.loading_label = QLabel(self) # 创建QLabel标签
self.loading_label.setMovie(self.loading_gif) # 将动图装载到标签容器里面
self.loading_gif.start() # 让动图开始动起来
# self.loading_gif.stop() # 让动图停止,一般情况下不需要停止动图,只需要关闭动图呈现的窗口界面即可
这样一个能呈现动图的QLabel就创建好了
加载窗口的呈现
我们要实现加载窗口就需要创建一个QWidget界面,而整个界面就动图一个标签,界面还需要进行透明化设置
代码实现:
# 加载动画的窗口
class Loading_Win(QWidget):
def __init__(self,mainWin):
super(Loading_Win, self).__init__()
# 获取主窗口的坐标
self.m_winX = mainWin.x()
self.m_winY = mainWin.y()
self.initUI()
def initUI(self):
# 设置窗口基础类型
self.resize(250,250) # 设置加载界面的大小
self.move(self.m_winX+340,self.m_winY+155) # 移动加载界面到主窗口的中心
self.setWindowFlags(Qt.FramelessWindowHint | Qt.Dialog | Qt.WindowStaysOnTopHint) # 设置窗口无边框|对话框|置顶模式
# 设置背景透明
self.setAttribute(Qt.WA_TranslucentBackground)
# 加载动画画面
self.loading_gif = QMovie('./img/loading_b.gif')
self.loading_label = QLabel(self)
self.loading_label.setMovie(self.loading_gif)
self.loading_gif.start()
主窗口背景虚化即不可操作
要实现主窗口不可操作就需要设置窗口的mainWindow.WindowModality属性
Qt中WindowModality属性有三种:
常量 | 含义 |
---|---|
Qt.NonModal | 窗口不是模式窗口(默认) |
Qt.WindowModal | 窗口是单窗口层次结构模式,并阻止其父窗口及其他父窗口和组父窗口的所有兄弟窗口获得输入 |
Qt.ApplicationModal | 窗口是应用的模式窗口,阻塞所有其他应用窗口获得输入 |
self.setWindowModality(Qt.ApplicationModal) # 设置主窗口不可操作
Loading_Gif.show() # 呈现加载界面
self.setWindowModality(Qt.NonModal) # 恢复正常模式