我正在开发基于PyQt 5.12.2的应用程序,它捆绑为Mac应用程序,并且使用QtQuick / QML作为其UI。 参见https://github.com/manuel-koch/gitover/tree/Workaround_stuck_ui_renderer
每天开始工作后(打开笔记本电脑的盖子),应用程序似乎坏了:
但UI本身似乎卡住了,它不会重新渲染任何内容,例如单击或选择可见项目后,不突出显示内容,也不会根据业务逻辑的基础Qt对象的更改重新渲染。
即该应用程序的行为正常,只是UI不重新渲染!?
我可以手动解决此问题
此后问题消失,UI继续重新渲染(直到第二天早上)。
我尝试实现一种变通方法,只要它检测到长时间不活动(例如,定期调度的QTimer长时间未触发),就以编程方式执行以下两个简单步骤(调整主窗口大小,打开/关闭对话框)
def size_window(wnd, w, h):
if w is not None:
wnd.setProperty("width", w)
if h is not None:
wnd.setProperty("height", h)
def resize_window(wnd):
LOGGER.info("Workaround: resize window")
w = wnd.width()
h = wnd.height()
size_window(wnd, w - 32, h - 32)
size_window(wnd, w, h)
def open_and_close_about_dlg(wnd):
LOGGER.info("Workaround: opening about dialog")
aboutDialog = wnd.findChildren(QObject, "theAboutDialog")[0]
try:
QMetaObject.invokeMethod(aboutDialog, "openDialog")
QTimer.singleShot(50, lambda: QMetaObject.invokeMethod(aboutDialog, "closeDialog"))
except:
LOGGER.exception("Failed to apply workaround")
def fix_hanging_qml_renderer(wnd):
resize_window(wnd)
open_and_close_about_dlg(wnd)
但是这种解决方法似乎没有与手动执行相同的效果!即应用程序触发的解决方法后,UI仍未重新呈现。