2010-08-21 3 views
0

J'ai un QTableView qui extrait une liste d'emplacements et de coordonnées de latitude/longitude à partir d'une base de données SQLite. Je veux extraire la latitude et la longitude de la ligne que l'utilisateur a sélectionnée dans la table, et j'utilise le code suivant, mais il semble assez compliqué. Peut-être que je ne comprends pas comment utiliser pleinement le système modèle/vue de Qt. Puis-je écrire ce code de manière plus claire et plus compacte?Qt: Accès aux cellules d'un QTableView

QModelIndexList list1 = this->ui->tableView->selectionModel()->selectedRows(1); 
QModelIndexList list2 = this->ui->tableView->selectionModel()->selectedRows(2); 

if (list1.count() != 1 || (list1.count() != list2.count())) 
{ 
    return; 
} 

double latitude = list1.at(0).data().toDouble(); 
double longitude = list2.at(0).data().toDouble(); 

Répondre

4

Je suppose que votre tableau ressemble à ceci:

 
+--------+--------+---------+ 
|Location|Latitude|Longitude| 
+--------+--------+---------+ 
| A | 11'.22"| 11'.22" | 
+--------+--------+---------+ 

Seen du code ci-dessus, je conclus que vous voulez que vos utilisateurs de sélectionner une seule ligne tout à la fois. S'il est si je vous suggère de définir les propriétés suivantes sur votre QTableView:

ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows); 
ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection); 

Ensuite, je connect() à selectionChanged signal du modèle de sélection:

connect(ui->tableView, SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &), 
     this,   SLOT(onSelectionChanged(const QItemSelection &)))); 

Voici la mise en œuvre de la fente:

void MainWindow::onSelectionChanged(const QItemSelection & selected) { 
    // Due to selection mode and behavior settings 
    // we can rely on the following: 
    // 1. Signal is emited only on selection of a row, not its reset 
    // 2. It is emited for the whole selected row 
    // 3. Model selection is always valid and non-empty 
    // 4. Row indexes of all items in selection match 

    int rowIndex = selected.indexes().at(0).row(); 

    double latitude = model->index(rowIndex, 1).date().toDouble(); 
    double longitude = model->index(rowIndex, 2).data().toDouble(); 

    // Do whatever you want with the values obtained above 
} 
+0

Qu'est ce que le 'modèle'? Il n'y a pas de méthode index() sur un QItemSelectionModel ... –

+1

Le modèle est la source de vos données. Vous avez dit que vous alimentez votre QTableView à partir de la base de données SQLite, donc probablement une instance de [QSqlTableModel] (http://doc.trolltech.com/latest/qsqltablemodel.html) ou [QSqlRelationalTableModel] (http: //doc.trolltech. com/latest/qsqlrelationaltablemodel.html). Fondamentalement, c'est ce que vous passez à 'ui-> tableView-> setModel()' comme seul paramètre. –

+0

Ah, bien sûr! Un 'QSqlTableModel', oui. Merci pour votre aide et désolé pour le retard dans l'acceptation. Mon code a l'air beaucoup plus propre maintenant. –