PySide emit signal causes python to crash

送分小仙女□ 提交于 2019-12-06 16:24:00

Substitute SIGNAL("atzero") with SIGNAL("atzero(int)") both in checkzero and in Form.__init__, because the way you're declaring it, it carries no argument.

Edit: your code in the "new-style",

import sys
from PySide.QtCore import *
from PySide.QtGui import *

class ZeroSpinBox(QSpinBox):
    zeros = 0

    def __init__(self, parent=None):
        super(ZeroSpinBox, self).__init__(parent)
        self.valueChanged.connect(self.checkzero)

    atzero = Signal(int)

    def checkzero(self):
        if self.value() == 0:
            self.zeros += 1
            self.atzero.emit(self.zeros)

class Form(QDialog):
    def __init__(self, parent= None):
        super(Form, self).__init__(parent)

        dial = QDial()
        dial.setNotchesVisible(True)
        spinbox = ZeroSpinBox()
        spinbox.setRange(0,200)
        dial.setRange(0,200)

        layout = QHBoxLayout()
        layout.addWidget(dial)
        layout.addWidget(spinbox)
        self.setLayout(layout)

        dial.valueChanged.connect(spinbox.setValue)
        spinbox.valueChanged.connect(dial.setValue)
        spinbox.atzero.connect(self.announce)

        self.setWindowTitle("Signals and Slots Part 2")

    @Slot(int)
    def announce(self, zeros):
        print "ZeroSpinBox has been at zero %d times" % zeros


if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = Form()
    form.show()
    app.exec_()

This due to a difference between PySide and PyQt4, which is documented here (actually, strictly speaking, this is a bug in PySide - using a unsupported form of signal syntax should produce an error, not crash the application).

The book you are using was written specifically for PyQt4, and so you probably need to be aware of the differences between PySide and PyQt4 when using it. See here, for example.

Note that the PyQt4 version of your script works fine, with or without the parenthesized portion of the signal - all that matters is that they are the same. However, this is only true for user-defined signals - for predefined Qt signals and slots, you must always include the parenthesized portion of the signature.

Another thing you should be aware of, is that the signal/slot syntax you are using has been superceeded by a much more pythonic new-style syntax. So, at some point, it would be worthwhile reading through the guidance found here, if your book doesn't cover it.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!