Как подключить пользовательский сигнал к слоту в 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_()