2009-02-05 5 views
5

Je montre un menu contextuel pour sélectionner certaines valeurs dans un QTableWidget. L'élément le plus bas est une entrée "Modifier la liste", quand je la sélectionne, une nouvelle fenêtre devrait apparaître automatiquement et le QComboBox devrait disparaître et la cellule retourner à un état Qt :: DisplayRole.Comment puis-je dire à QTableWidget de mettre fin à l'édition d'une cellule?

Maintenant Qt a tous ces beaux appels API comme QTableWidget.edit() et QTableWidget.editItem(), ce que je suis vraiment à la recherche est un QTableWidget.endEditing(), de préférence, sans préciser l'indice de la cellule, bien que je puisse obtenir qu'utiliser cet appel:

table.currentIndex() 

... mais je ne sais pas si je peux garantir que la cellule en cours est la cellule en cours d'édition à tout moment.

Existe-t-il une API pour fermer ce type d'éditeur?

Popup menu

Répondre

7

QTableWidget hérite de 19 fentes publiques de QWidget. L'un d'eux est setDisabled(), qui devrait désactiver les événements d'entrée pour ce widget et tous ses enfants.

Je voudrais essayer:

table.setDisabled(true); 
table.setDisabled(false); 

Bien que vous avez dit qu'il ne fonctionne pas pour vous, il existe une méthode alternative: Si vous ne souhaitez pas que (la table perd le focus, je crois), vous peut essayer d'utiliser EditTriggers. Par exemple:

table.setEditTriggers(QAbstractItemView::NoEditTriggers); 
+0

Votre le premier a fonctionné, le second non. Cela n'a pas d'importance de perdre le focus parce que je montre un dialogue modal. Je vais marquer cette réponse comme correcte si personne ne va proposer une solution plus naturelle. –

+0

Je viens de lancer un exemple pour tester EditTriggers et il semble fonctionner (C++, Qt 4.4.3). Je peux cliquer sur chaque cellule et ainsi de suite, mais je ne peux pas double-cliquer dessus pour les modifier ou quoi que ce soit. Je ne sais pas pourquoi ça ne marche pas pour toi. * shrug * –

+0

Il s'agit de fermer l'éditeur, ne pas être en mesure de le modifier. La prochaine fois que l'on cliquera deux fois, l'éditeur devrait être à nouveau ouvert. –

1

Vous pourrez peut-être utiliser QTableWidget.closePersistentEditor() pour fermer l'éditeur. Toutefois, QAbstractItemView.closeEditor() peut être plus proche de ce que vous voulez, d'autant plus que vous semblez être à l'aise avec l'API QModelIndex et que vous utilisez déjà un widget d'éditeur personnalisé.

2

table.setCurrentItem(None) est ce qui a fonctionné pour moi. (N'oubliez pas de bloquer les signaux si vous utilisez une fonction de slot cellChanged/itemChanged.)

Ceci est avec PyQt. Pour C++ je pense remplacer None par NULL.

0

Je ne peux pas parler pour les widgets de liste. Mais, je suis arrivé ici en essayant de faire quelque chose de similaire. Je double-cliquais sur une cellule, et en fonction de la colonne, en faisant apparaître un sous-formulaire avec une liste, puis, quand cela était fermé, passer à la colonne appropriée suivante en fonction de la valeur sélectionnée. Mon problème était que je pouvais obtenir la valeur dans la cellule et "sélectionner" la prochaine cellule appropriée, mais la cellule originale est restée sélectionnée en mode d'édition!

Il m'est finalement apparu que mon double clic était la sélection de la cellule, c.-à-d. édition.

Un simple clic sélectionne la cellule mais n'ouvre pas un mode d'édition.

Side note: Jamais pourrait obtenir ce sous forme d'agir véritablement modal, donc je créé une boucle sous la forme d'appel: alors que la forme sous était visible, avec le seul code étant app.processEvents()

Questions connexes