PyQt4 的信号与槽机制改写为兼容 PyQT5 的形式
记录博文
一、前言
PyQt4 到 PyQt5 还是改了很多东西的,特别是信号与槽的机制。
比如:
# PyQt4
self.connect(buttonBox, SIGNAL("accepted()"),
self, SLOT("accept()"))
# PyQt5
buttonBox.accepted.connect(self.accept)
这样直接该代码是没问题,但是有的情况下,一些 PyQt4 代码封装为某种简便的函数,改起来就有点突然不知道怎么办。
本文就是记录这么一个情况,并提供一个解决办法。
二、具体情况
比如下面的代码:
# PyQt4
def createAction(self, text, slot=None, shortcut=None, icon=None,
tip=None, checkable=False, signal="triggered()"):
action = QAction(text, self)
if icon is not None:
action.setIcon(QIcon(":/{}.png".format(icon)))
if shortcut is not None:
action.setShortcut(shortcut)
if tip is not None:
action.setToolTip(tip)
action.setStatusTip(tip)
if slot is not None:
self.connect(action, SIGNAL(signal), slot)
if checkable:
action.setCheckable(True)
return action
这里的信号,属于一个字符串,一时突然不知道怎么改,(⊙o⊙)…。
三、灵感突发
看下面这段简单的代码:
class A(object):
def a(self):
print('GodLordGee')
def b(self):
c= 'a'
func = getattr(self, c, None)
func()
test = A()
test.b()
运行结果:
GodLordGee
>>>
这样,原来可以啊。ok,这个问题可以解决了。
四、PyQt5 兼容 PyQt4 的代码
#PyQt5
def createAction(self, text, slot=None, shortcut=None, icon=None,
tip=None, checkable=False, signal="triggered()"):
action = QAction(text, self)
if icon is not None:
action.setIcon(QIcon(":/{}.png".format(icon)))
if shortcut is not None:
action.setShortcut(shortcut)
if tip is not None:
action.setToolTip(tip)
action.setStatusTip(tip)
if slot is not None:
getattr(action, signal.split('(')[0]).connect(slot)
if checkable:
action.setCheckable(True)
return action
五、总结
一直用 Python 的.
取用类的属性,忘记了getattr
的方式,没想到可以在这里用到。
点我回顶部 ☚
Fin.