Есть некоторые понятия, которые необходимо уточнить
[сигнал и слот QT] VS [сигнал и слот Python]
Все предопределенные сигналы и слоты, предоставляемые pyqt, реализованы с помощью кода C ++ QT. Всякий раз, когда вы хотите иметь настраиваемый сигнал и слот в Python, это сигнал и слот Python. Следовательно, есть четыре случая для подачи сигнала в слот:
- из сигнала QT в слот QT
- из сигнала QT в слот Python
- от сигнала Python до слота QT
- от сигнала Python до слота Python
Код ниже показывает, как подключиться к этим четырем различным scnarios
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class Foo(QtCore.QObject):
def __init__(self, parent=None):
super(Foo, self).__init__(parent)
dial = QDial()
self.spinbox = QSpinbox()
# --------------------------------------
# QT signal & QT slot
# --------------------------------------
# option 1: more efficient
self.connect(self.spinbox, SIGNAL("valueChanged(int)"),
dial, SLOT("setValue(int)"))
# option 2:
self.connect(self.spinbox, SIGNAL("valueChanged(int)"),
dial.setValue)
# --------------------------------------
# QT signal & Python slot
# --------------------------------------
self.connect(self.spinbox, SIGNAL("valueChanged(int)"),
self.myValChanged)
# --------------------------------------
# Python signal & Qt slot
# --------------------------------------
# connect option 1: more efficient
self.connect(self, SIGNAL("mysignal"), dial,
SLOT("setValue(int)"))
# connect option 2:
self.connect(self, SIGNAL("mysignal"), dial.setValue)
# emit
param = 100
self.emit(SIGNAL("mysignal"), param)
# --------------------------------------
# Python signal & Python slot
# --------------------------------------
# connect
self.connect(self, SIGNAL("mysignal"), self.myValChanged)
# emit
param = 100
self.emit(SIGNAL("mysignal"), param)
def myValChanged(self):
print "New spin val entered {0}".format(self.spinbox.value())
Вывод -
Сигнатура сигнала для сигнала Python отличается от сигнатуры сигнала QT тем, что он не имеет круглых скобок и может передаваться любым типам данных python при его излучении. Сигнал Python создается при его излучении.
Для слота есть три вида подписей.
- s.connect (w, SIGNAL ("signalSignature"), functionName)
- s.connect (w, SIGNAL ("signalSignature"), instance.methodName)
- s.connect (w, SIGNAL ("signalSignature"), экземпляр, SLOT ("slotSignature"))
Номера 1 и 2 доступны для слота Python, а номера 2 и 3 доступны для слота QT. Понятно, что кроме предопределенного слота QT любая функция / метод, вызываемый Python, квалифицируется как слот Python.
Эти пункты приведены в статье Саммерфилда о сигналах и слотах .
[сигнал и слот qt старого стиля] VS [сигнал и слот qt старого стиля]
Ну, все вышеприведенное описание основано на сигнале и слоте pyqt старого стиля. Как сказал @Idan K, есть альтернативный новый стиль, особенно для сигнала Python. Подробнее см. здесь