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)
在过去的几天里,我阅读了很多关于新旧风格的信号槽的内容。现在好像更容易了,但是我卡在了一个问题上。
在我的项目中,旧代码根据传递给它的名称生成动态信号。
示例:
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)