PyQt envio de parâmetro para slot quando ligar a um sinal
Pergunta
Eu tenho um menu barra de tarefas que, quando clicado está conectado a um slot que recebe o evento de disparo. Agora o problema é que eu quero saber qual item de menu foi clicado, mas eu não sei como enviar essa informação para a função conectado. Aqui é o usado para conectar a ação para a função:
QtCore.QObject.connect(menuAction, 'triggered()', menuClickedFunc)
Eu sei que alguns eventos retornar um valor, mas acionado () não. Então, como faço para fazer isso acontecer? Eu tenho que fazer o meu próprio sinal?
Solução
Use um lambda
Aqui está um exemplo do PyQt livro :
self.connect(button3, SIGNAL("clicked()"),
lambda who="Three": self.anyButton(who))
A propósito, você também pode usar functools.partial
, mas acho que o método lambda
mais simples e mais clara.
Outras dicas
Como já mencionado aqui você pode usar a função lambda para passar argumentos extras para o método que você deseja executar.
Neste exemplo você pode passar um obj string para o AddControl function () chamado quando o botão é pressionado.
# Create the build button with its caption
self.build_button = QPushButton('&Build Greeting', self)
# Connect the button's clicked signal to AddControl
self.build_button.clicked.connect(lambda: self.AddControl('fooData'))
def AddControl(self, name):
print name
Fonte: snip2code - Usando Lambda Função para passar argumento extra na PyQt4
uso functools.partial
caso contrário você vai achar que você não pode passar argumentos dinamicamente quando script está sendo executado, se você usar lambda.
Em geral, você deve ter cada item do menu conectado a um slot diferente, e têm cada alavanca de entalhe a funcionalidade apenas para que o item de menu próprio. Por exemplo, se você tem itens de menu como "salvar", "fechar", "aberto", você deve fazer um slot separado para cada, não tentar ter um único slot com uma declaração caso nele.
Se você não quiser fazê-lo dessa forma, você poderia usar o QObject :: remetente () função para obter um ponteiro para o remetente (ou seja: o objecto que emitiu o sinal). Eu gostaria de ouvir um pouco mais sobre o que você está tentando realizar, no entanto.
Eu também gostaria de acrescentar que você pode usar o método sender
se você só precisa descobrir o que Widget enviou o sinal. Por exemplo:
def menuClickedFunc(self):
# The sender object:
sender = self.sender()
# The sender object's name:
senderName = sender.objectName()
print senderName