PyQt 在使用像 pyObj.setupUi(parent) 这样的链式调用后丢弃所有信号和槽

PyQt drops all of signals and slots after using chained invoke like pyObj.setupUi(parent)

一旦我使用 DummyWidget().setupUi(mainWin),所有信号(例如下面代码中的 textChanged)将被删除并且 printDummy 函数将被静音,但是当我使用 dw = DummyWidget(); dw.setupUi(main) 时一切都会正常工作。我没有看到 Python 语法的具体区别。谁能分享任何评论?

class DummyWidget(object):
    def setupUi(self, parent=None):
        assert parent is not None
        self.parent = parent
        parent.resize(480, 320)
        self.DUMMY = QtGui.QLineEdit(parent)
        # parent.setCentralWidget(self.DUMMY)
        self.DUMMY.textChanged.connect(self.printDummy)
        QtGui.QApplication.processEvents()

    def printDummy(self):
        print "DUMMY IN CLASS"


if __name__ == "__main__":
    import sys

    def printDummy(*args):
        print "DUMMY"

    app = QtGui.QApplication(sys.argv)
    # mainWin = MainWindow()
    # edit = QtGui.QLineEdit()
    # edit.textChanged.connect(printDummy)
    # mainWin.setCentralWidget(edit)
    mainWin = QtGui.QDialog()
    # DummyWidget().setupUi(mainWin)
    dw = DummyWidget()
    dw.setupUi(mainWin)
    mainWin.show()
    # mainWin.open()
    sys.exit(app.exec_())

如果您不保留对 DummyWidget 实例的引用,它将被垃圾回收,因此您的插槽将不复存在。

如果您这样做 DummyWidget.setupUi(parent),您将无法存储引用(此行为您提供 setupUi 的 return 值,即 None)。