gpt4 book ai didi

python - QCoreApplication.processEvents 行为

转载 作者:太空宇宙 更新时间:2023-11-04 02:49:00 24 4
gpt4 key购买 nike

我的工作时间非常重要,我对 processEvents() 的行为有疑问。当我调用 processEvents() 时,它是否在单独的线程/进程上运行,以便在执行更多代码时它可能仍在运行?

如果不是,我的代码是否有可能在 processEvents() 之后但在我显示器上的所有像素都更新为最新场景之前继续执行(可能是因为操作系统处理像素绘制)?下面是伪代码

app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.drawScene()
app.processEvents() #Force window to update to scene
print("Hi!") #Is there any chance of this being called before my screen's pixels are all set to the newest scene?

如果 processEvents() 之后的代码确实在屏幕像素全部更新之前运行,有没有办法保证在继续之前屏幕已更新?

最佳答案

QCoreApplication::processEvents()在您调用它的同一线程中运行,它不使用单独的线程。它将处理当前在事件队列中排队的所有事件。如果有类型为 QEvent::Paint 的事件在队列中,它将触发窗口的重绘。你的drawScene()可能会通过直接或间接调用 QWidget::update() 将绘画事件放入事件队列中.

是的,请调用 processEvents()将完成挂起的重绘,并且仅在处理完重绘事件后返回。

FWIW,QProgressDialog::setValue()内部调用 processEvents()以确保进度条已更新,因此它也必须在那里工作。

我能想到的导致像素不显示的唯一原因是所谓的平台插件中特定于平台的代码在重新绘制时执行异步操作。需要仔细检查您正在使用的操作系统的平台插件代码才能绝对确定。

实际上在X11上似乎就是这种情况,它是异步的。检查docs for QTest::qWaitForWindowExposed - 在内部调用 processEvents()在一个循环中,直到 QWindow::isExposed()返回真。所以至少对于最初显示的窗口,你需要运行 processEvents()在循环中以确保窗口实际显示。我不知道是否需要重新粉刷。参见 the section "Visibility and Windowing System Exposure" in the docs of QWindow了解更多详情。

关于python - QCoreApplication.processEvents 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44396099/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com