Как подключить пользовательский сигнал к слоту в pyside с новым синтаксисом?

Это пример из видеоурока:

#!/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, первое с новым синтаксисом подключения, второе со старым синтаксисом. Существует также строка для создания того же второго соединения с новым синтаксисом, но он не работает, поэтому он закомментирован. Нулевой сигнал сделан на заказ, и кажется, что сигналы сделаны, это не работает с новым синтаксисом. Это связано с методами эмиссии? Как я могу применить новый синтаксис и к нулевому сигналу?

1 ответ

Решение

Вы должны объявить новый сигнал в классе вашего реализованного или наследования;

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)

Также вы можете прочитать этот документ для получения дополнительной информации.


Пример реализации кода (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_()
Другие вопросы по тегам