PyQt4 的信号与槽机制改写为兼容 PyQT5 的形式

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.

猜你喜欢

转载自blog.csdn.net/Enderman_xiaohei/article/details/109197747