Каков правильный метод обработки событий в PyQt 4?
Вопрос
Я видел подобные примеры:
self.connect(self.ui.add_button, QtCore.SIGNAL('clicked()'),self.printer)
И примеры, подобные этому:
self.ui.add_button.clicked.connect(self.printer)
Я только начинаю изучать Qt;на каком из них мне следует сосредоточиться?
Решение
Я думаю, что второй пример поддерживается только некоторыми версиями Qt (более новыми), в то время как первый поддерживается более старыми.Но и то, и другое верно.
Другие советы
AFAIK, новый стиль не работает при наличии перегруженных сигналов, так что
self.ui.add_button.clicked.connect(self.printer)
не может быть использован, если есть также, скажем,
clicked(float, float)
так что вам придется вернуться к старому стилю.Всегда полезно знать и то, и другое.
Я знаю, что этот пост довольно старый, но я только что наткнулся на него, может быть, вы тоже наткнетесь, и теперь это спасет вам положение ;) хорошо...кстати, это мой первый пост здесь, на SO, yey!
ВНИМАНИЕ, я не тестировал этот код, я просто скопировал некоторые фрагменты кода, которые написал некоторое время назад, поэтому может возникнуть какая-то ошибка, но я надеюсь, что это все равно поможет
Новый стиль PyQt сигнализирует кратко:
# notice that the signal declarations are at class level (not inside some method)
class MyClass(QObject): # must subclass QObject (or subclass)
# declaring signals
mySimpleSignal = pyqtSignal()
mySignalWithArguments = pyqtSignal(int, list)
myOverloadedSignal = ([int, object],[str,object])
def __init__(self, parent=None):
super(MyClass,self).__init__(parent=parent) # remember to init the super class
[...]
# methods
[...]
# connecting signals
def connectSignalsMethod(self):
# connecting simple signal
self.mySimpleSignal.connect(self.mySlot)
# connecting signal with arguments
self.mySignalWithArguments.connect(self.mySlotWithArguments)
# connecting overloaded signals
self.myOverloadedSignal[int, object].connect(self.mySlot1)
self.myOverloadedSignal[str, object].connect(self.mySLot2)
# same syntax for disconnect()
# emitting signals
def emitSignalsMethod(self):
# emitting simple signal
self.mySimpleSignal.emit()
# emitting signal with arguments
self.mySignalWithArguments.emit(123,['this','is','a','list'])
# emitting overloaded signal
myOverloadedSignal[str,object].emit('this is a string', myObject)
# my slots
@pyqtSlot()
def mySlot(self):
print('hey!')
@pyqtSlot(int, list)
def mySlotWithArguments(self, someNumber, someList):
print('got a number: %d and a list: %s' % (someNumber, someList))
@pyqtSlot(int, object)
def mySlot1(self, intArg, objectArg):
print('got an int and an object')
@pyqtSlot(str, object)
def mySlot2(self, str, object):
print('got a string and an object')
# an overloaded slot
@pyqtSignal(int)
@pyqtSignal(str)
def overloadedSlot(someArgument)
print('got something: %s' % someArgument)
в противном случае попробуйте следующее http://www.harshj.com/2010/05/06/pyqt-faq-custom-signals-jpeg-mouse-hovers-and-more/#custom
Редактировать:события и сигналы - это не одно и то же, то, что вы видите выше, касается сигналов