2010-11-26 24 views
1

Je programme une sorte de carnet d'adresses. Sur le côté gauche de mon application, j'ai un QListView pour afficher les noms de mes contacts. Sur le côté droit de ma demande, j'ai un formulaire pour taper les informations (par exemple, le nom, l'adresse, le numéro de téléphone) de mes contacts. Je stocke les données de mes contacts dans un QSqlTableModel. J'utilise ma QListView pour afficher une colonne de mon QSqlTableModel.Comment sélectionner un élément dans un QListView qui correspond au dernier enregistrement inséré du QSqlTableModel sous-jacent?

Ma question est la suivante: Comment puis-je sélectionner automatiquement l'élément dans mon QListView qui correspond au dernier contact inséré dans mon QSqlTableModel?

Voilà comment je créé mon modèle:

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); 
db.setDatabaseName("datenbank.db"); 

model = new QSqlTableModel(this, db); 
model->setTable("demodaten"); 
model->setEditStrategy(QSqlTableModel::OnManualSubmit); 
model->setSort(0, Qt::AscendingOrder); 
model->select(); 

view->setModel(model); 
view->setModelColumn(0); 

Voici comment ajouter un nouveau record à mon modèle:

QSqlRecord record = model->record(); 
for(int i = 0; i<record.count(); i++){ 
    record.setValue(i, ""); 
} 

record.setValue("codenummer", p.getCodeNummer()); 
record.setValue("vorname", p.getVorname()); 
record.setValue("nachname", p.getNachname()); 
record.setValue("geburtsdatum", p.getGeburtsdatum()); 

model->insertRecord(-1, record); 
model->submitAll(); 

Répondre

1

vous pouvez connecter au signal rowsInserted de votre QSqlTableModel; il doit être déclenché chaque fois que de nouvelles lignes sont insérées dans le modèle. Dans l'emplacement correspondant, sélectionnez les lignes insérées à l'aide de la méthode selectionModel de listview.

dans votre tête widget parent définissent le modèle et la fente:

private: 
    QSqlTableModel *_model; 

private slots: 
    void on_rowsInserted(const QModelIndex &source_parent, int start, int end); 

connecter au signal rowsInserted du modèle dans votre constructeur widget:

connect(_model, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(on_rowsInserted(QModelIndex,int,int))); 

possible mise en œuvre on_rowsInserted:

void YourParentWidget::on_rowsInserted(const QModelIndex &source_parent, int start, int end) 
{ 
    QModelIndex index = _model->index(start, 0); 
    if (index.isValid()) 
    { 
     ui->listView->selectionModel()->clear(); 
     ui->listView->selectionModel()->select(index, QItemSelectionModel::Select); 
    } 
} 

espérons que cela aide, salutations

+0

Salut Serge, merci beaucoup pour ton aide! Mais malheureusement, cela ne fonctionne pas. Toujours le premier élément de mon QListView est sélectionné.Ce qui est bizarre à côté de cela est que on_rowsInserted() semble être appelé deux fois lorsqu'une nouvelle ligne est insérée dans mon QSqlTableModel. Dans le premier appel, start est toujours l'index du dernier élément de ma QListView. Dans le second appel, il est toujours 0. – Tom

+0

"on_rowsInserted() semble être appelé deux fois" ne sonne pas juste pour moi; Je devine que vous auriez besoin de poster une partie de votre code car la cause de votre problème est dans les détails de comment vous initialisez le modèle et comment de nouvelles lignes sont insérées –

+0

Salut Serge, j'ai ajouté du code. Peut-être que vous avez maintenant une idée de comment résoudre mon problème. Merci d'avance! – Tom

0

De Qt Doc:

bool QSqlTableModel::insertRecord (int row, const QSqlRecord & record) 
Inserts the record after row. If row is negative, the record will be appended to 
the end. 

Demandez-vous la table? Le dernier élément inséré n'est pas le dernier élément de la table?

obtenir un index presisten avec:

QModelIndex QAbstractItemModel::index (int row, int column, const QModelIndex & parent = QModelIndex()) 
int QAbstractItemModel::rowCount (const QModelIndex & parent = QModelIndex()) const 

(colonne est pas important si vous avez selectionMode Row)

QPersistentModelIndex (const QModelIndex & index) 

anter l'insert, mais avant la submitAll();

et sélectionnez cette ligne avec (vous ne devez pas utiliser un modèle de sélection si vous ne vous dérange pas de changer l'indice actuel)

void QAbstractItemView::setCurrentIndex (const QModelIndex & index) 

Il sélectionne l'élément aussi.

Vous pouvez également faire défiler pour rendre le nouvel élément visible:

void QAbstractItemView::scrollTo (const QModelIndex & index, ScrollHint hint = EnsureVisible) 

Modifié: Je ne sais pas comment je vois l'ordre didsnt avant ....

+0

Nvm, juste vu que vous commandez le modèle. Vous pouvez annuler la commande lors de l'ajout et la définir après l'ajout? Obtenez un QPersistenModelIndex et faites ce que j'ai déjà dit auparavant http://harmattan-dev.nokia.com/docs/library/html/qt4/qpersistentmodelindex.html – Trompa