如何打开小部件,让它做某事,然后自行关闭?
how to open widget, have it do something, and close by itself?
我正在尝试执行以下操作:
我有一个 QMainWindow 对象。从中,我想打开 window,让它做一些事情,然后自行关闭。
喜欢开始某事 > 使用“正在加载..”消息打开 window > 做这件事 > 让 window 自行关闭,无需用户交互。
我已经尝试创建一个 QWidget class 并将“做事”方法放在那里,但是当我在 QWidget 上调用 .show() 方法时,整个应用程序挂起并且没有不更进一步,可能我没看懂背后的逻辑
我正在使用 Python 3.7.7,PyQT5,我的 OS 是 Windows 10 x64(如果重要的话)
希望我正确理解了您的问题。我会通过以下方式解决问题:
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_()
我正在尝试执行以下操作:
我有一个 QMainWindow 对象。从中,我想打开 window,让它做一些事情,然后自行关闭。
喜欢开始某事 > 使用“正在加载..”消息打开 window > 做这件事 > 让 window 自行关闭,无需用户交互。
我已经尝试创建一个 QWidget class 并将“做事”方法放在那里,但是当我在 QWidget 上调用 .show() 方法时,整个应用程序挂起并且没有不更进一步,可能我没看懂背后的逻辑
我正在使用 Python 3.7.7,PyQT5,我的 OS 是 Windows 10 x64(如果重要的话)
希望我正确理解了您的问题。我会通过以下方式解决问题:
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_()