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?

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top