python - Pasar el argumento a la conexión PyQt SIGNAL
qmenu (3)
Aquí hay un enfoque diferente: en lugar de adjuntar los datos como un argumento al manejador de señal, adjúntelo al elemento de menú mismo. Esto ofrece una flexibilidad mucho mayor, ya que los datos no están ocultos dentro de una función anónima, por lo que cualquier parte de la aplicación puede acceder a ellos.
Es muy fácil de implementar, porque Qt ya proporciona las API necesarias. Aquí es cómo se vería su código de ejemplo si tomara este enfoque:
for j in range(0, len(self.InputList)):
arrow = QtGui.QPushButton(self)
arrow.setGeometry(QtCore.QRect(350, 40*(j+3)+15, 19, 23))
menu = QtGui.QMenu(self)
group = QtGui.QActionGroup(menu)
for element in SomeList:
action = menu.addAction(element)
action.setCheckable(True)
action.setActionGroup(group)
action.setData(j)
arrow.setMenu(menu)
group.triggered.connect(self.SomeFunction)
def SomeFunction(self, action):
print(action.data())
¿Es posible pasar un argumento a las conexiones de señal de PyQt4? En mi caso, tengo n botones con el mismo menú creado dinamicamente en la interfaz, dependiendo de la entrada del usuario:
for j in range(0, len(self.InputList)):
arrow = QtGui.QPushButton(Form)
arrow.setGeometry(QtCore.QRect(350, 40*(j+3)+15, 19, 23))
menu = QtGui.QMenu(Form)
for element in SomeList:
cb = QtGui.QRadioButton(element,menu)
ca = QtGui.QWidgetAction(menu)
ca.setDefaultWidget(cb)
QtCore.QObject.connect(cb,QtCore.SIGNAL("stateChanged(int)"),self.SomeFunction)
arrow.setMenu(menu)
Aunque el menú es el mismo para todos los botones en la interfaz, el usuario debe poder seleccionar un valor de cualquiera de los botones y, para cualquiera de ellos, la acción es la misma ("agregar el valor seleccionado a una línea editar" ") con la única diferencia de que la edición de línea podría ser la 1ª y la 2ª , la 3ª .
Lo que me gustaría preguntar, entonces, es si hay alguna manera de pasar un argumento j aquí:
QtCore.QObject.connect(cb,QtCore.SIGNAL("stateChanged(int)"),self.SomeFunction(j))
EJEMPLO :
En esta ejecución, las entradas del usuario son 3, por lo que tendré 3 ediciones de línea y tres botones con el mismo menú:
Line Edit 1:
Line Edit 2:
Line Edit 3:
Usando la misma función SomeFunction
, me gustaría editar el valor de las ediciones de línea. Entonces, si el usuario está tocando el menú adjunto a la edición de la 2ª línea, se SomeFunction
la función SomeFunction
con el argumento 2 SomeFunction(2)
, por lo que el mismo método se entenderá a sí mismo Line Edit es el correcto:
Line Edit 1:
Line Edit 2: modified
Line Edit 3:
Lo necesito porque la cantidad de ediciones de línea en la ventana principal depende de lo que el usuario esté seleccionando. Soy un novato y hasta ahora siempre he creado una función para cualquier objeto en la GUI, pero esta vez el número es dinámico y estoy seguro de que hay formas más elegantes de crear este tipo de conexiones de señal, que No he entendido aunque tan lejos de mi lectura de documentaciones.
Tenga en cuenta que está utilizando una versión en desuso de la implementación de SIGNAL / SLOT en PyQt que se ha eliminado en PyQt5 (e incluso su implementación actual en PyQt4 es un poco problemática).
Si es posible, cambiaría la sintaxis SIGNAL / SLOT en tu código.
La forma en que funciona el nuevo mecanismo Signal / Slot es este:
class Worker(QThread):
stateChanged = Signal(int)
....
def some_method(self):
self.stateChanged.emit(1)
En el hilo de GUI, de manera similar tendría algo como esto (suponiendo que worker = Worker()
se define en alguna parte:
class GUI(QDialog)
worker = Worker()
def __init__(self, parent=None):
super(GUI, self).__init__(parent)
self.worker.stateChanged.connect(self.my_desired_method)
def my_desired_method(self, param):
print param #prints out ''1''
Por supuesto, este código no funcionaría "fuera de la caja", pero es un concepto general de cómo las señales / ranuras deben manejarse en PyQt (y PySide).
Creo que esto debería ayudar.
self.op = "point"
QtCore.QObject.connect(self.radioButton, QtCore.SIGNAL("clicked(bool)"),lambda : self.anyButton(self.radioButton.isChecked(),self.op))
def anyButton(self,kol,vv):
print kol
print vv
El resultado es
>>>
True
point
puede ver esto: PyQt enviando el parámetro a la ranura cuando se conecta a una señal