2009-06-24 13 views
8

Dopo la creazione di un modello da tavolo in Qt 4.4 così:problema con QSqlTableModel - senza aggiornamenti automatici

QSqlTableModel *sqlmodel = new QSqlTableModel(); 

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

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

il contenuto viene visualizzato correttamente, ma la modifica non è possibile, l'errore:

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

puoi incollare il codice per la query che stai eseguendo anche tu? – nmuntz

+1

non ci sono query. La query è necessaria per QSqlQueryModel. Invece, QSqlTableModel mostra solo una tabella (permettendo anche di modificarla). "QSqlTableModel fornisce un modello modificabile per mostrare una singola tabella. ... La visualizzazione risultante è modificabile perché il modello è modificabile." da "Fondamenti di sviluppo Qt" di Johan Thelin – MadH

risposta

12

Posso confermare che il bug esiste esattamente come lo si segnala, in Qt 4.5.1, E che la documentazione, ad es. here, fornisce ancora un esempio errato (ad esempio uno che include la chiamata removeColumn).

Come soluzione ho provato a scrivere uno slot collegato al segnale beforeUpdate, con l'idea di controllare cosa c'è che non va con il QSqlRecord che sta per essere aggiornato nel DB e possibilmente correggendolo, ma io posso Per far sì che funzioni, qualsiasi chiamata ai metodi di quel parametro del record blocca la mia app giocattolo con un BusError.

Quindi ho rinunciato a quell'idea e sono passato a quello che è senza dubbio il modo giusto per farlo (la visibilità dovrebbe essere determinata dalla vista, non dal modello, giusto? -): perdere il removeColumn e in sostituzione di esso chiama invece tableView->setColumnHidden(0, true). In questo modo gli ID sono nascosti e tutto funziona.

Quindi penso che possiamo confermare che c'è un errore di documentazione e aprire un problema al riguardo nel tracker Qt, quindi può essere corretto nel prossimo ciclo di documenti, giusto?

+0

sì, grazie! :-) – MadH

+3

ha speso tutta la mia reputazione per confermare che :-)) – MadH

0

sembra che la causa di questo è stato in linea

sqlmodel->removeColumn(0); 

Dopo aver commentato fuori, tutto funziona perfec tly. Così, dovrò trovare un altro modo per non mostrare l'identificativo del nella tabella ;-)

EDIT ho detto "sembra", in quanto nell'esempio da "Fondamenti di sviluppo Qt" Johan Anche Thelin rimosse la prima colonna. Quindi, sarebbe bello se anche qualcun altro ci provasse e riferisse i risultati.

0

Io uso Qt 4.6.1 in PyQt e il problema è ancora qui. La rimozione di "removeColumn (0)" risolve il problema.

Problemi correlati