Pergunta

wx (e wxPython) tem dois eventos que eu perder em PyQt:

  • EVT_IDLE que está sendo enviado para um quadro. Ele pode ser usado para atualizar os vários widgets de acordo com o estado do aplicativo
  • EVT_UPDATE_UI que está sendo enviado para um widget quando tem de ser redesenhado e atualizado, para que eu possa calcular o seu estado no manipulador

Agora, PyQt não parece ter estes, eo livro PyQt sugere escrever um método updateUi e chamando-o manualmente. Eu mesmo acabou chamando-o de um temporizador uma vez por 0,1 segundos, de modo a evitar muitas chamadas manuais de métodos que podem atualizar o GUI. Estou esquecendo de algo? Existe uma maneira melhor de conseguir isso?


Um exemplo: Eu tenho um aplicativo simples com um botão Iniciar que inicia algum processamento. O botão de arranque deve ser ativado somente quando um arquivo foi aberto usando o menu. Além disso, há um widget permanente na barra de status que exibe informações.

Meu aplicativo tem estados:

  1. Antes do arquivo é aberto (neste estado o status bar de mostrar algo especial e o botão de arranque é desativado)
  2. O arquivo foi aberto e processamento não foi iniciado: o botão de arranque estiver activada, barra de status mostra algo else
  3. O processamento está em execução: o botão de arranque agora diz "Stop", e os relatórios da barra de status de progresso

Em Wx, eu teria o evento de atualização da interface do usuário do botão lidar com seu estado: o texto sobre ele, e se ele está habilitado, dependendo do estado do aplicativo. O mesmo para a barra de status (ou eu usaria EVT_IDLE para isso).

Em Qt, eu tenho que atualizar o botão em vários métodos que podem afetar o estado, ou simplesmente criar um método update_ui e chamá-lo periodicamente em um timer. Qual é o "QT" forma mais -ish?

Foi útil?

Solução

O uso de EVT_UPDATE_UI em wxWidgets parece destacar uma das diferenças fundamentais na forma como wxWidgets e Qt esperar que os desenvolvedores eventos punho em seu código.

Com o Qt, você conecta sinais e slots entre os widgets na interface do usuário, ou manipulação "lógica de negócios" em cada slot ou delegá-lo a um método dedicado. Você normalmente não se preocupe em fazer mudanças separadas para cada widget em sua GUI porque todos os pedidos repintar será colocado na fila de eventos e entregues quando o controle retorna ao ciclo de eventos. Alguns eventos de pintura pode até ser unidas por uma questão de eficiência.

Assim, em uma aplicação normal Qt onde os sinais e slots são usados ??para mudanças de estado punho, há, basicamente, não há necessidade de ter um mecanismo ociosa que monitora o estado dos widgets de aplicativos e atualização porque essas atualizações devem ocorrer automaticamente.

Você teria que dizer um pouco mais sobre o que você está fazendo para explicar por que você precisa de um equivalente a este evento em Qt.

Outras dicas

Gostaria de enviar sinais Qt para indicar mudanças de estado (por exemplo fileOpened, processingStarted, processingDone). Slots em objetos que gerem o botão de arranque e status barra de widgets (ou subclasses) podem ser conectados a esses sinais, em vez de "sondagem" para o estado atual em um evento ocioso.

Se quiser que o sinal a ser adiada mais tarde no ciclo de eventos, em vez de imediatamente (por exemplo, porque ele vai demorar um pouco de tempo para fazer alguma coisa), você pode usar uma "fila" Ligação de sinal-slot em vez do tipo normal.

http://doc.trolltech.com/4.5/signalsandslots.html#signals

O tipo de conexão é um parâmetro opcional para a função connect (): http://doc.trolltech.com/4.5/qobject.html#connect, http://doc.trolltech.com/4.5/qt.html# ConnectionType-enum

Tanto quanto eu entendo EVT_IDLE é enviado quando fila de mensagens aplicativo está vazio. Não existe tal evento em Qt, mas se você precisa executar alguma coisa no Qt quando há eventos não pendente, você deve usar QTimer com 0 tempo limite.

Em geral, a forma mais Qt-ish é atualizar o botão / barra de ferramentas conforme necessário em qualquer funções requerem a atualização, ou para consolidar algumas das funcionalidades e directamente chamar essa função quando o programa precisa dele (como um updateUI função).

Você deve estar ciente de que, em Qt, mudando um atributo de um elemento Ui não provocar um redesenho imediato, mas as filas um redesenho do sistema para eventos e várias chamadas de redesenho são compactados em um sempre que possível.

Como para as várias alterações relativas ao estado, ter um olhar para este post cerca de um esperemos-próximo além de Qt para mais facilmente estados punho. Parece que este iria cuidar de um monte de suas queixas, porque em suas múltiplas funções, você pode simplesmente fazer a transição a variável de estado, e as outras partes da interface do usuário deve atualizar para corresponder. Não é positivo que esta vai fazê-lo na próxima versão Qt (embora eu apostaria nele, ou algo similar), e não tenho idéia de como intimamente PyQt acompanha os lançamentos Qt. Ou alternativamente, você poderia usar o conceito e criar sua própria classe para controlar o estado, conforme necessário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top