的应用程序在第二天唤醒后停止重新渲染

时间:2019-06-07 10:56:13

标签: python pyqt qml pyqt5

我正在开发基于PyQt 5.12.2的应用程序,它捆绑为Mac应用程序,并且使用QtQuick / QML作为其UI。 参见https://github.com/manuel-koch/gitover/tree/Workaround_stuck_ui_renderer

每天开始工作后(打开笔记本电脑的盖子),应用程序似乎坏了:

  • 我可以点击UI元素,例如主菜单项会相应更改
  • 我可以通过主菜单或键盘快捷键触发操作

但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仍未重新呈现。

0 个答案:

没有答案