通过QtCore.SignalMapper调用插槽

时间:2014-03-24 15:17:08

标签: python pyqt4 signals-slots

我想通过具有不同参数的相同函数检查几个QtGui.QLineEdits中的用户输入。我试过QtCore.SignalMapper。这是我在测试应用程序中的代码:

    self.signalMapper = QtCore.QSignalMapper(self)
    QtCore.QObject.connect(self.lineEdit_331, QtCore.SIGNAL(_fromUtf8('returnPressed()')), self.signalMapper.map)
    QtCore.QObject.connect(self.lineEdit_341, QtCore.SIGNAL(_fromUtf8("returnPressed()")), self.signalMapper.map)
    self.signalMapper.setMapping(self.lineEdit_331,'links')
    self.signalMapper.setMapping(self.lineEdit_341,'rechts')
    QtCore.QObject.connect(self.signalMapper, QtCore.SIGNAL(_fromUtf8("mapped(QString)")),self.test)

signalMapper存在且所有连接都返回'True'但没有调用插槽(在更改'connect'和'setMapping'的顺序后相同)。 将lineEdits信号连接到插槽工作:

    QtCore.QObject.connect(self.lineEdit_331, QtCore.SIGNAL(_fromUtf8("returnPressed()")), self.test_1)

我的代码有什么问题?谢谢你的帮助

1 个答案:

答案 0 :(得分:1)

您的代码的主要问题是您使用丑陋,容易出错的旧式语法来连接信号,而不是new-style syntax

以下是您的示例代码的重写:

    self.signalMapper = QtCore.QSignalMapper(self)
    self.lineEdit_331.returnPressed.connect(self.signalMapper.map)
    self.lineEdit_331.returnPressed.connect(self.signalMapper.map)
    self.signalMapper.setMapping(self.lineEdit_331, 'links')
    self.signalMapper.setMapping(self.lineEdit_341, 'rechts')
    self.signalMapper.mapped[str].connect(self.test)

如果您对原始代码无法正常工作感到好奇,那是因为您应该在前两个连接中使用SLOT。应该是:

    QtCore.QObject.connect(
        self.lineEdit_331, QtCore.SIGNAL('returnPressed()'),
        self.signalMapper, QtCore.SLOT('map()'))

这是因为QSignalMapper.map有两个重载,所以你需要指定你打算使用哪一个。