|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
![]() ![]() Ingénieur développement logiciels Inscription : mai 2009 Messages : 572 ![]() |
Bonjour,
J'ai une table, avec des cases texte éditables. Je veux que la première colonne ne comporte que des noms uniques. Donc lorsque l'on modifie une case de cette colonne, je veux que la modification ne soit acceptée que si ce texte est unique sur la colonne. Premier problème : intercepter l'édition Pour ça, le mieux que j'ai trouvé c'est : Code C++ :
J'ai choisi en cas de souci d'afficher une popup d'erreur, et de laisser le champ éditable, avec le texte sélectionné. Ça me semble pas mal comme comportement. L'avantage de redéfinir commitData(), c'est que je peux rester au texte d'avant en n'acceptant pas le commit. Bon ça marchouille à quelques détails-près : commitData() est déclenchée deux fois (pour la case de droite aussi)... Et aussi un deuxième gros problème : Deuxième problème : ne traiter que les éléments de la première colonne Et oui, en passant dans commitData(), je n'ai qu'un pauvre QWidget*, et le souci c'est de trouver à quelle case il correspond pour savoir si je dois le traiter ou non ! J'ai vu que createEditor() semble être le seul endroit où on peut faire le lien entre une case (QModelIndex) et un editor. J'ai voulu redéfinir QStyledItemDelegate pour "sauvegarder" l'editor et avoir une méthode pour le récupérer, mais il n'y a qu'un seul objet delegate de créé pour toutes les cases... Vous n'auriez pas une bonne idée ? Ou un autre chemin à prendre pour faire la même chose ? Je ne comprends pas qu'on n'ait pas une méthode editor(index) disponible, alors que dans les sources de Qt il y en a une d'utilisée en private. Ce serait utile je pense. |
||
|
|
00
|
|
|
#2 |
![]() ![]() Ingénieur développement logiciels Inscription : mai 2009 Messages : 572 ![]() |
Pas de réponse... Bon en attendant, je vais juste désactiver la possibilité d'éditer ma colonne. J'ai cherché encore, en mettant un delegate particulier à la colonne, mais même, je n'arrive pas à faire un lien avec l'editor.
|
|
|
00
|
|
|
#3 |
![]() ![]() ![]() Alexandre LaurentÉtudiant Inscription : mai 2008 Messages : 6 560 ![]() |
Bonjour,
Pour détecter le changement de votre première colonne, il faut connecter un slot à ce signal itemChanged(). Comme le slot devra accepter un QTableWidgetItem vous aurez à disposition toutes les informations nécessaires, tel que le numéro de la colonne et ainsi vous pouvez faire un test simple pour savoir si on parle bien de la première colonne.
__________________
Vous souhaitez participer à la section Jeux ? Contactez-moi ![]() La rubrique a aussi un blog ! Ma page sur DVP Mon Portfolio Qui connaît l'erreur, connaît la solution. |
|
|
00
|
|
|
#4 |
![]() ![]() Ingénieur développement logiciels Inscription : mai 2009 Messages : 572 ![]() |
Lorsque ce signal arrive, c'est déjà trop tard, l'item a été édité. Avec commitData(), tant que je n'appelle pas QTableWidget::commitData ( editor ), l'item n'est pas modifié, donc si l'utilisateur ferme l'application, les données seront sauvegardées sans erreur (recopie du tableau dans un fichier, dans le destructeur). Après s'il n'y a que ça à faire... Je reste sur mon interdiction d'édition de cette colonne. Mais je trouve vraiment cette histoire de QWidget * editor mal foutue...
|
|
|
00
|
|
|
#5 |
![]() ![]() ![]() Alexandre LaurentÉtudiant Inscription : mai 2008 Messages : 6 560 ![]() |
Il est changé dans la vue, mais pas dans le modèle, si ?
__________________
Vous souhaitez participer à la section Jeux ? Contactez-moi ![]() La rubrique a aussi un blog ! Ma page sur DVP Mon Portfolio Qui connaît l'erreur, connaît la solution. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com