PyQt4 到 PyQt5 迁移

PyQt4 to PyQt5 migration

在过去的几天里,我阅读了很多关于新旧风格的信号槽的内容。现在好像更容易了,但是我卡在了一个问题上。

在我的项目中,旧代码根据传递给它的名称生成动态信号。

示例:

self.netlink.connect(self.netlink,SIGNAL(self.modelName + "_gotCommand"),self.processCommand)

这里是 emit

self.emit(SIGNAL(model + "_gotCommand"), cmd, data)

数据可以是基于模型的不同类型(列表、元组、字符串等)

那么我该如何将这段代码移动到 Qt5 中,因为我们需要用 pyqtSignal 定义来描述每个信号。

无法使用新式语法动态发射任意信号。所有信号都必须在 class.

中预先定义

你的例子没有说明为什么你需要为每个模型使用不同的信号名称,因为你总是连接到同一个插槽。让每个模型发出相同的信号似乎更有意义,如有必要,也许还发送模型名称:

class SomeModel(QObject):
    gotCommand = pyqtSignal(str, str, object)

    def doSomething(self):
        ...
        self.gotCommand.emit(model, cmd, data)

...

self.netlink.gotCommand.connect(self.processCommand)

但是如果你还需要connect/emit按键信号,你可以使用getattr:

getattr(self.netlink, self.modelName + "_gotCommand")).connect(self.processCommand)

和:

getattr(self, model + "_gotCommand").emit(cmd, data)