2009-06-24 9 views
8

Après la mise en place d'un modèle de table dans Qt 4.4 comme ceci:problème QSqlTableModel - aucune mise à jour automatique

QSqlTableModel *sqlmodel = new QSqlTableModel(); 

    sqlmodel->setTable("Names"); 
    sqlmodel->setEditStrategy(QSqlTableModel::OnFieldChange); 
    sqlmodel->select(); 
    sqlmodel->removeColumn(0); 

    tableView->setModel(sqlmodel); 
    tableView->show(); 

le contenu est affiché correctement, mais le montage est impossible, erreur:

 QSqlQuery::value: not positioned on a valid record 
+0

pouvez-vous coller le code pour la requête que vous exécutez aussi? – nmuntz

+1

il n'y a pas de requête. La requête est requise pour QSqlQueryModel. Au lieu de cela, QSqlTableModel affiche simplement une table (permettant également de l'éditer). "QSqlTableModel fournit un modèle modifiable pour afficher une seule table ... La vue obtenue est modifiable car le modèle est modifiable." de "Foundations of Qt development" par Johan Thelin – MadH

Répondre

12

Je peux confirmer que le bogue existe exactement comme vous l'avez signalé, dans Qt 4.5.1, ET que la documentation, par ex. here, donne toujours un mauvais exemple (c'est-à-dire un exemple comprenant l'appel removeColumn). En guise de solution de rechange, j'ai essayé d'écrire un slot connecté au signal beforeUpdate, avec l'idée de vérifier ce qui ne va pas avec le QSqlRecord qui est sur le point d'être mis à jour dans la DB et éventuellement de le réparer, mais je peux t que cela fonctionne - tous les appels aux méthodes de ce paramètre d'enregistrement écrasent mon app jouet avec un BusError.

Donc j'ai abandonné cette idée et suis passé à ce qui est sans doute la bonne façon de le faire (la visibilité devrait être déterminée par la vue, pas par le modèle, non?): Perdre le removeColumn Appelez plutôt tableView->setColumnHidden(0, true). De cette façon, les ID sont cachés et tout fonctionne. Donc je pense que nous pouvons confirmer qu'il y a une erreur de documentation et ouvrir un problème à ce sujet dans le suivi Qt, donc cela peut être corrigé dans la prochaine série de docs, n'est-ce pas?

+0

oui, merci! :-) – MadH

+3

a passé toute ma réputation pour confirmer que :-)) – MadH

0

il semble que la cause de cela était conforme

sqlmodel->removeColumn(0); 

Après avoir commenté dehors, tout fonctionne perfec tly. Ainsi, je vais devoir trouver une autre façon de ne pas montrer ID de la table ;-)

EDIT je l'ai dit « il semble », parce que dans l'exemple de « fondements du développement Qt » Johan Thelin a également supprimé la première colonne. Donc, ce serait bien si quelqu'un d'autre essaie aussi cela et rapporte les résultats.

0

J'utilise Qt 4.6.1 dans PyQt et le problème est toujours là. Supprimer "removeColumn (0)" résout le problème.

Questions connexes