gpt4 book ai didi

python - PySide:小部件插槽的多个装饰器

转载 作者:太空宇宙 更新时间:2023-11-04 10:55:04 25 4
gpt4 key购买 nike

我在 Python 中使用 PySide 的主窗口类有很多成员函数,例如:

@QtCore.Slot()
def on_myButton_clicked(self) :
...

我想添加我自己的装饰器,但以下不起作用:'

def my_decorator(f) :
def wrapper(*args, **kwargs) :
f(*args, **kwargs)
return wrapper

...

@QtCore.Slot()
@my_decorator
def on_myButton_clicked(self) :
...

当我这样做时,QtCore.QMetaObject.connectSlotsByName 似乎没有将方法与按钮连接起来。这可以轻松解决吗?

最佳答案

connectSlotsByName 从已注册的插槽中工作,而 Slot 从给定函数的 __name__ 中工作。

on_myButton_clicked定义时的名称是'on_myButton_clicked'。但是,您随后将其传递给装饰器;装饰器函数返回一个名为 'wrapper' 的函数。所以 Slot 用那个名字注册它,不是 'on_myButton_clicked'

要解决这个问题,请使用 functools.wraps :

def my_decorator(f):
@functools.wraps(f)
def wrapper(*args, **kwargs):
f(*args, **kwargs)
return wrapper

除其他事项外,这会整理出 __name__,以便槽将以正确的名称注册。

总是使用functools.wraps是个好习惯;它将使调试某些情况更容易。

关于python - PySide:小部件插槽的多个装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10481562/

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