【问题标题】:PyQt4 to PyQt5 migrationPyQt4 到 PyQt5 的迁移
【发布时间】:2017-11-09 21:18:54
【问题描述】:

在过去的几天里,我阅读了很多关于信号和插槽的新旧样式。现在似乎更容易了,但我坚持一个问题。

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

例子:

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

这里是发射

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

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

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

【问题讨论】:

标签: pyqt pyqt4 pyqt5


【解决方案1】:

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

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

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

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

...

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

但如果还需要按键连接/发射信号,可以使用getattr

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

和:

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

【讨论】:

  • 很遗憾,但我需要动态信号,因为我们有典型的窗口,比如说投资组合和价格。所以投资组合 1 的变化应该只影响价格 1 窗口和投资组合 2 只影响价格 2。所以我们只需将 id 添加到窗口名称并在运行时创建信号 - 插槽连接。
猜你喜欢
  • 1970-01-01
  • 2016-10-14
  • 2020-08-03
  • 2018-03-15
  • 1970-01-01
  • 2017-09-01
  • 2019-09-30
  • 2018-05-19
相关资源
最近更新 更多