gpt4 book ai didi

python - 我怎样才能给 PyQT 的 QApplication.notify() 打补丁来计时事件

转载 作者:行者123 更新时间:2023-12-04 09:44:47 25 4
gpt4 key购买 nike

在我们的 PyQt 应用程序中,我们希望对所有 Qt 事件的持续时间进行计时。仅在特殊的性能监控模式下。以前我继承了 QApplication 并覆盖了 notify()方法,效果很好。我把数据写在chrome://tracing格式,它非常有帮助。

然而,当我们的应用程序在 Jupyter 中运行时,有一个预先存在的 QApplication 实例。所以我想不出如何让它使用我的子类。

相反,我尝试在下面进行猴子修补,但我的 notify()永远不会被调用。我怀疑 notify()是一个包装的 C++ 方法,它不能被猴子修补?

def monkey_patch_event_timing(app: QApplication):
original_notify = app.notify

def notify_with_timing(self, receiver, event):
timer_name = _get_timer_name(receiver, event)

# Time the event while we handle it.
with perf.perf_timer(timer_name, "qt_event"):
return original_notify(receiver, event)

bound_notify = MethodType(notify_with_timing, app)

# Check if we are already patched first.
if not hasattr(app, '_myproject_event_timing'):
print("Enabling Qt Event timing...")
app.notify = bound_notify
app._myproject_event_timing = True

有没有办法猴子补丁 QApplication.notify或者以其他方式在可以为每个 Qt 事件计时的地方插入代码?

最佳答案

一种可能的解决方案是在 sip 的帮助下删除旧的 QApplication 并创建一个新的:

def monkey_patch_event_timing():

app = QApplication.instance()
if app is not None:
import sip
sip.delete(app)

class MyApplication(QApplication):
def notify(self, receiver, event):
ret = QApplication.notify(self, receiver, event)
print(ret, receiver, event)
return ret

app = MyApplication([])
return app

关于python - 我怎样才能给 PyQT 的 QApplication.notify() 打补丁来计时事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62180549/

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