
效果如上图,实现一个网络加载等待框,loadingDialog.py 文件源码如下:
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QMovie
#记载等待框
from PyQt5.QtWidgets import QDialog, QLabel, QProgressBar, QPushButton, QVBoxLayout, QWidget, QApplication
class LoadingDialog(QDialog):
def __init__(self, parent=None, hint:str = '加载中...'):
super().__init__(parent)
self.text_label = None
self.hint = hint
self.movie = None
self.loading_label = None
self.initUI()
def initUI(self):
self.setWindowTitle( self.hint )
# 隐藏关闭按钮
self.setWindowFlags(self.windowFlags() | Qt.FramelessWindowHint)
#固定大小
self.setFixedSize(150, 150)
# 布局
layout = QVBoxLayout()
self.text_label = QLabel()
self.text_label.setText('加载中...')
self.text_label.setAlignment(Qt.AlignCenter)
layout.addWidget(self.text_label, alignment=Qt.AlignCenter)
# 显示加载动画的标签
self.loading_label = QLabel()
self.loading_label.setFixedSize(100, 100)
self.loading_label.setAlignment(Qt.AlignCenter)
layout.addWidget(self.loading_label, alignment=Qt.AlignCenter)
self.movie = QMovie("./loading.gif") # 加载 GIF 动画(确保在同一目录下有 loading.gif)
self.loading_label.setMovie(self.movie)
self.movie.start()
self.setLayout(layout)
self.setModal(True)
self.show()
#关闭self.accept() # 关闭对话框
#dialog.exec_() == QDialog.Accepted 是否退出
使用此组件,NetworkApp.py源码如下:
import sys
import requests
from PyQt5.QtCore import QThread, pyqtBoundSignal
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QPushButton, QWidget, QProgressDialog
from com.label.www.ui.dialog.loadingDialog import LoadingDialog
class NetworkApp(QMainWindow):
def __init__(self):
super().__init__()
self.thread = None
self._loadingDialog = None
self.initUI()
def initUI(self):
self.setWindowTitle('网络加载等待框示例')
# 主窗口的中心小部件
central_widget = QWidget()
self.setCentralWidget(central_widget)
# 布局
layout = QVBoxLayout()
# 按钮触发请求
self.request_button = QPushButton('获取数据')
self.request_button.clicked.connect(self.make_request)
layout.addWidget(self.request_button)
central_widget.setLayout(layout)
def make_request(self):
# QT自己的组件
# 创建进度对话框
# progress_dialog = QProgressDialog("加载中...", None, 0, 0, self)
# progress_dialog.setWindowTitle("请稍候")
# progress_dialog.setModal(True) # 设置为模态框
# progress_dialog.setCancelButton(None) # 移除取消按钮
# progress_dialog.show()
#
# # 使用线程处理网络请求
# self.thread = NetworkThread(progress_dialog)
# self.thread.finished.connect(progress_dialog.close) # 请求完成后关闭对话框
# self.thread.start()
# 第二种自定义
self._loadingDialog = LoadingDialog(self)
# 使用线程处理网络请求
self.thread = NetworkThread(self._loadingDialog)
self.thread.finished.connect(self._loadingDialog.accept) # 请求完成后关闭对话框
self.thread.start()
class NetworkThread(QThread):
def __init__(self, progress_dialog):
super().__init__()
self.progress_dialog = progress_dialog
def run(self):
try:
# 模拟网络请求
response = requests.get('http://jsonplaceholder.typicode.com/todos/1')
response.raise_for_status() # 检查请求是否成功
data = response.json() # 解析返回的 JSON 数据
print("获取的数据:", data) # 打印获取的数据
except requests.exceptions.RequestException as e:
print("请求失败:", e)
def main():
app = QApplication(sys.argv)
network_app = NetworkApp()
network_app.resize(300, 150)
network_app.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
QT中有一个加载框组件(QProgressDialog ),我这里自定义了一个gif加载组件,以上就是该实例的全部代码,希望对您有帮助。