【发布时间】:2023-03-25 17:30:01
【问题描述】:
【问题讨论】:
【问题讨论】:
您的应用程序变黑,因为事件循环没有运行。
Qt 通过让事件循环永远运行来运行。它等待事件并在它们进入队列时对其进行处理。事件循环正在获取一个事件,调用您的函数,并等待您的函数完成,直到它继续运行下一个事件。您的函数显示窗口/小部件/对话框,然后在 time.sleep 中停留 2 秒。当它处于 time.sleep 时,Qt 事件循环仍在等待您的函数结束以处理更多事件。
有 3 种方法可以处理这种情况。
QApplication.processEvents()
QTimer - 您只需显示您的窗口,然后让计时器调用一个函数来关闭您的窗口。
self.widg = ...
self.widg.show()
self.widg.raise_() # if already show bring to top
def close_and_delete_widg():
self.widg.close()
self.widg.setParent(None) # Remove reference
self.widg.deleteLater()
self.widg = None # Remove python reference count.
self.tmr = QtCore.QTimer()
self.tmr.setSingleShot(True)
self.tmr.timeout.connect(close_and_delete_widg)
self.tmr.start(2000) # 2 sec
我创建了一个库来帮助在近似超时qt_thread_updater 上运行。该库通过持续运行计时器和调用已发布的函数来工作。你基本上告诉它运行一个函数,它稍后会在主事件循环中运行一个函数。延迟函数不准确。这个库更多地用于线程。但是,它使您无需管理计时器。
from qt_thread_updater import get_updater
self.widg = ...
self.widg.show()
self.widg.raise_() # if already show bring to top
def close_and_delete_widg():
self.widg.close()
self.widg.setParent(None) # Remove reference
self.widg.deleteLater()
self.widg = None # Remove python reference count.
get_updater().delay(2, close_and_delete_widg) # After approximately 2 seconds call
线程 - 我将跳过,因为您的用例不需要它。
QApplication.processEvents() - 不建议这样做。它可能会导致问题,但可能仍然有效。本质上,事件循环正在等待您的函数完成。如果您致电 QApplication.processEvents(),您是在告诉您的应用程序在您当前正在等待此事件完成时处理更多事件。
self.widg = ...
self.widg.show()
self.widg.raise_() # if already show bring to top
start = time.time()
while (time.time() - start) <= 2: # Sec or msec?
QtCore.QApplication.processEvents() # QtCore.QApplication.instance().processEvents()
# Close and delete the widget
self.widg.close()
self.widg.deleteLater()
self.widg = None
【讨论】: