将继承的mixin方法装饰为pyq

2024-04-25 06:08:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一节课。我想创建一个Logger类,我可以公开给QML供QML使用。既然我想使用的所有方法都来自LogMixIn,那么有没有一种方法来修饰继承的方法,而不是像我在下面的示例中那样重新定义它们?你知道吗

我的日志_自由基

class LogMixIn():

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

质量标准_记录器.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代码中使用,因此希望保持它的不可知性。你知道吗


Tags: 方法fromimportself示例defmsglogger
1条回答
网友
1楼 · 发布于 2024-04-25 06:08:43

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

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可以创建一个内部代理QObject,其中包含Qt可以使用的插槽。对于QML,唯一重要的是方法可以通过元对象系统访问,这样就可以通过invokeMethod调用它们。你知道吗

注意pyqtSignalpyqtProperty也可以在mixin中使用。但是,这种行为只在PyQt5中引入,因此在PyQt4中根本不起作用。不过,我相信在PySide的所有版本中都会发现类似的行为。你知道吗

更新

如果不能直接装饰mixin,则可以在子类定义中创建插槽,如下所示:

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

相关问题 更多 >