首页 > 解决方案 > 如何打开小部件,让它做某事,然后自行关闭?

问题描述

我正在尝试执行以下操作:

我有一个 QMainWindow 对象。从中,我想打开窗口,让它做一些事情,然后自己关闭。

就像开始某事>使用“正在加载..”消息打开窗口>做某事>让窗口自行关闭而无需用户交互。

我试图创建一个 QWidget 类并将“做事”方法放在那里,但是当我在 QWidget 上调用 .show() 方法时,整个应用程序挂起并且没有进一步,但也许我没有不明白背后的逻辑。

我正在使用 Python 3.7.7、PyQT5,我的操作系统是 Windows 10 x64(如果它很重要)

标签: pythonpyqtpyqt5

解决方案


我希望我正确理解了你的问题。我将通过以下方式解决问题:

from PyQt5 import QtTest
from PyQt5.QtCore import QTimer, Qt
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel, QVBoxLayout, QWidget

import sys


class MainWindow(QMainWindow):

    def __init__(self):
        super().__init__()
        self.loading_window = None
        self.button = QPushButton("Push for Window")
        self.button.clicked.connect(self.show_new_window)
        self.setCentralWidget(self.button)
        self.timer = QTimer()

    def show_new_window(self):
        if self.loading_window is None:
            self.loading_window = LoadingWindow()
        self.loading_window.show()
        self.do_your_job()
        self.close_loading_window()

    def do_your_job(self):
        # Do whatever you want here
        QtTest.QTest.qWait(1500)

    def close_loading_window(self):
        self.loading_window = None


class LoadingWindow(QWidget):

    def __init__(self):
        super().__init__()
        layout = QVBoxLayout()
        self.label = QLabel('Loading')
        layout.addWidget(self.label)
        self.setLayout(layout)
        self.setWindowFlag(Qt.FramelessWindowHint)


app = QApplication(sys.argv)
w = MainWindow()
w.show()
app.exec_()

推荐阅读