关于pyqt:PyQt4到PyQt5的迁移

PyQt4 to PyQt5 migration

在过去的几天里,我读了很多关于新的和旧的信号和时隙的文章。现在似乎更容易了,但我坚持在一个问题上。

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

例子:

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

这里是Emit

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

根据模型,数据可以是diffrenet类型(list、tuple、string等)。

所以我如何将这个代码移动到qt5中,因为我们需要用pyqtSignal定义描述每个信号。


不能使用新的语法动态地发出任意信号。所有信号必须在类中预先定义。

您的示例并不清楚为什么需要为每个模型使用不同的信号名称,因为您总是连接到同一个插槽。让每个模型发出相同的信号似乎更有意义,如果需要,也可以发送模型名称:

1
2
3
4
5
6
7
8
9
10
class SomeModel(QObject):
    gotCommand = pyqtSignal(str, str, object)

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

...

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

但如果仍需按键连接/发射信号,则可以使用getattr:

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

还有:

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