如何使用新语法将自定义信号连接到 pyside 中的插槽?

2023-12-07

这是一个例子来自视频教程:

#!/usr/bin/env python3

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

class ZeroSpinBox(QSpinBox):

    zeros = 0

    def __init__(self):
        super().__init__()
        self.valueChanged.connect(self.checkzero)

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



class Form(QDialog):

    def __init__(self):
        super().__init__()

        dial = QDial()
        dial.setNotchesVisible(True)
        zerospinbox = ZeroSpinBox()
        layout = QHBoxLayout()
        layout.addWidget(dial)
        layout.addWidget(zerospinbox)
        self.setLayout(layout)

        dial.valueChanged.connect(zerospinbox.setValue)
        zerospinbox.valueChanged.connect(dial.setValue)
        # zerospinbox.atzero.connect(self.announce)
        self.connect(zerospinbox, SIGNAL("atzero(int)"), self.announce)

        self.setWindowTitle("Signals")

    def announce(self, zeros):
        print("zerospinbox has been at zero " + str(zeros) + " times.")



app = QApplication(sys.argv)
form = Form()
form.show()
app.exec_()

请注意,我为 Zerospinbox 对象建立了两个连接,第一个使用新的连接语法,第二个使用旧的语法。还有一行用于使用新语法进行相同的第二个连接,但它不起作用,因此被注释掉。 atzero 信号是定制的,似乎信号使得这与新语法不能很好地配合。这是由于排放方法造成的吗?如何将新语法也应用于 atzero 信号?


您必须在您实现或继承的类中声明新信号;

class ZeroSpinBox (QSpinBox):
    atzero = Signal(int)
    .
    .

然后,您可以在新式信号中调用它。用于发射信号;

        self.emit(SIGNAL("atzero(int)"), self.zeros)

改成

        self.atzero.emit(self.zeros)

用于连接信号;

         self.connect(zerospinbox, SIGNAL("atzero(int)"), self.announce)

改成

         zerospinbox.atzero.connect(self.announce)

您也可以阅读此内容document了解更多信息。


实现代码示例(PyQt4也相同PySide,不同的是名称Signal & pyqtSignal);

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class ZeroSpinBox(QSpinBox):
    atzero = pyqtSignal(int)

    zeros = 0

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

    def checkzero(self):
        if self.value() == 0:
            self.zeros += 1
#             self.emit(SIGNAL("atzero(int)"), self.zeros)
            self.atzero.emit(self.zeros)



class Form(QDialog):

    def __init__(self):
        super(Form, self).__init__()

        dial = QDial()
        dial.setNotchesVisible(True)
        zerospinbox = ZeroSpinBox()
        layout = QHBoxLayout()
        layout.addWidget(dial)
        layout.addWidget(zerospinbox)
        self.setLayout(layout)

        dial.valueChanged.connect(zerospinbox.setValue)
        zerospinbox.valueChanged.connect(dial.setValue)
        zerospinbox.atzero.connect(self.announce)
#         self.connect(zerospinbox, SIGNAL("atzero(int)"), self.announce)

        self.setWindowTitle("Signals")

    def announce(self, zeros):
        print("zerospinbox has been at zero " + str(zeros) + " times.")



app = QApplication(sys.argv)
form = Form()
form.show()
app.exec_()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用新语法将自定义信号连接到 pyside 中的插槽? 的相关文章

随机推荐