gpt4 book ai didi

python - 将继承的 mixin 方法装饰为 pyqtSlot

转载 作者:行者123 更新时间:2023-12-01 07:27:04 25 4
gpt4 key购买 nike

我有一个 LogMixIn 类。我想创建一个 Logger 类,我可以将其公开给 QML 供我的 QML 使用。由于我想要使用的所有方法都来自 LogMixIn,有没有一种方法可以装饰继承的方法,而不必像下面的示例中那样重新定义它们?

my_logging_lib.py

class LogMixIn():

def logDebug(self, msg):
# Log msg at Debug Severity

qml_logger.py

from PyQt5.QtCore import QObject, pyqtSlot
from my_logging_lib import LogMixIn

class QmlLogger(QObject, LogMixIn):

@pyqtSlot(str)
def logDebug(self, msg):
super().logDebug(msg)

注释 1: LogMixIn 在大部分非 UI 代码中使用,因此希望使其与 QT 无关。 p>

最佳答案

在PyQt5中,pyqtSlot可以装饰不继承自QObject的类的方法,例如普通的Python mixin类。您可以通过检查 meta-object 轻松检查这一点。继承此类 mixin 的子类:

from PyQt5.QtCore import pyqtSlot, QObject, QMetaMethod

class LogMixIn:
def logDebug(self, msg):
pass

@pyqtSlot(str)
def logDebugEx(self, msg):
pass

class QmlLogger(QObject, LogMixIn):
@pyqtSlot(str)
def logDebug(self, msg):
super().logDebug(msg)

foo = QmlLogger()

meta = foo.metaObject()

for index in range(meta.methodCount()):
method = meta.method(index)
if method.methodType() == QMetaMethod.Slot:
print(method.methodSignature())

输出:

b'deleteLater()'
b'_q_reregisterTimers(void*)'
b'logDebug(QString)'
b'logDebugEx(QString)'

如您所见,槽的定义方式没有区别。这是因为 PyQt 在建立实际连接之前不需要检查包含类的类型。如果当时发现接收者是一个QObject,PyQt可以创建一个带有Qt可以使用的槽的内部代理QObject。对于 QML,唯一重要的是这些方法可以通过元对象系统访问,以便可以通过例如invokeMethod .

请注意,pyqtSignalpyqtProperty 也可以在 mixins 中使用。然而,这种行为仅在 PyQt5 中引入,因此它在 PyQt4 中根本不起作用。不过,我相信所有版本的 PySide 中都存在类似的行为。

更新:

如果您无法直接修饰 mixin,则可以在子类定义中创建插槽,如下所示:

class QmlLogger(QObject, LogMixIn):
logDebug = pyqtSlot(str)(LogMixIn.logDebug)

关于python - 将继承的 mixin 方法装饰为 pyqtSlot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57396408/

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