Como posso saber a QTableWidget para terminar a edição de uma célula?
Pergunta
Estou mostrando um menu pop-up para selecionar alguns valores em uma QTableWidget. O item mais baixo é uma entrada "lista Modificar", quando eu selecioná-lo uma nova janela deve aparecer automaticamente eo QComboBox deve desaparecer e o retorno da célula a um estado Qt :: DisplayRole.
Agora Qt tem todas aquelas simpáticas API-chamadas como QTableWidget.edit()
e QTableWidget.editItem()
, o que eu realmente estou procurando é um QTableWidget.endEditing()
, de preferência sem especificar o índice da célula, embora eu poderia ter que usar esta chamada:
table.currentIndex()
... mas eu não sei se eu posso garantir que a célula atual é a célula que está sendo editado em todos os momentos.
Existe uma API para fechar esse tipo de editores?
Solução
QTableWidget herda 19 ranhuras públicas de QWidget. Uma delas é setDisabled (), que deve desativar eventos de entrada para esse widget e todos os seus filhos.
Gostaria de tentar:
table.setDisabled( true );
table.setDisabled( false );
Embora você disse que não funciona para você, não há um método alternativo: Se você não gosta de que (a tabela perde o foco, eu acredito), você pode tentar usar EditTriggers . Por exemplo:
table.setEditTriggers( QAbstractItemView::NoEditTriggers );
Outras dicas
table.setCurrentItem(None)
é o que funcionou para mim. (Não se esqueça de bloquear os sinais se você usar algum cellChanged / ItemChanged função slot.)
Este é com PyQt. Para C ++ Eu acho substituir Nenhum com NULL.
Você pode ser capaz de usar QTableWidget.closePersistentEditor () para fechar o editor. No entanto, QAbstractItemView.closeEditor () pode estar mais perto do que você quer, especialmente desde que você parece estar confortável com a API baseada em QModelIndex e já estão usando um widget de editor personalizado.
Eu não posso falar para a lista de widgets. Mas, eu tenho aqui tentando fazer algo semelhante.
I foi duplo clique sobre uma célula, e com base na coluna, trazendo-se uma sub-forma com uma lista, em seguida, quando esse movimento foi fechada para a próxima coluna apropriada com base no valor seleccionado.
Meu problema era que eu poderia obter o valor na célula e "selecionar" a próxima célula apropriado, mas a célula original ficou selecionado no modo de edição!
Ele finalmente me dei conta de que meu duplo-clique foi selecionando a célula, ou seja. edição.
Um único clique seleciona a célula, mas não abre um modo de edição.
Nota lateral: Nunca poderia obter esse sub-forma de agir verdadeiramente modal, então eu criei um laço na forma chamando: enquanto a forma sub era visível, com as únicas app.processEvents código que está sendo ()