效果如上图,实现一个网络加载等待框,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加载组件,以上就是该实例的全部代码,希望对您有帮助。