Qual è il metodo corretto per gestire gli eventi in PyQt 4?
Domanda
Ho visto esempi come questo:
self.connect(self.ui.add_button, QtCore.SIGNAL('clicked()'),self.printer)
Ed esempi come questo:
self.ui.add_button.clicked.connect(self.printer)
Sto appena iniziando a imparare Qt;su quale dovrei concentrarmi?
Soluzione
Penso che il secondo esempio sia supportato solo da alcune versioni di Qt (quelle più recenti), mentre il primo sia supportato da quelle più vecchie.Ma entrambi hanno ragione.
Altri suggerimenti
Per quanto ne so, lo stile più recente non funziona se ci sono segnali sovraccarichi, quindi
self.ui.add_button.clicked.connect(self.printer)
non può essere utilizzato se c'è anche, diciamo, a
clicked(float, float)
quindi dovresti ricorrere allo stile vecchio.È sempre bello conoscerli entrambi.
So che questo post è piuttosto vecchio, ma mi sono appena imbattuto, forse lo farai anche tu e ora questo salva la tua giornata;) OK ...a proposito, è il mio primo post qui su SO, sì!
ATTENZIONE, non ho testato questo codice, ho solo copiato alcuni frammenti di codice che ho scritto qualche tempo fa, quindi potrebbe esserci qualche errore, ma spero che sia comunque d'aiuto
Il nuovo stile di PyQt segnala brevemente:
# 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)
altrimenti prova questohttp://www.harshj.com/2010/05/06/pyqt-faq-custom-signals-jpeg-mouse-hovers-and-more/#custom
Modificare:eventi e segnali non sono la stessa cosa, quello che vedi sopra riguarda i segnali