2010-08-21 5 views
0

У меня есть QTableView, который вытягивает список местоположений и координаты широты/долготы из базы данных SQLite. Я хочу извлечь широту и долготу из строки, которую пользователь выбрал в таблице, и использую следующий код, но он выглядит довольно запутанным. Возможно, я просто не понимаю, как полностью использовать модель/систему просмотра Qt. Могу ли я написать этот код более четким, более компактным способом?Qt: Доступ к ячейкам в 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(); 

ответ

4

Я предполагаю, что ваша таблица выглядит следующим образом:

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

Seen из кода выше я делаю вывод, что вы хотите, чтобы пользователи, чтобы выбрать всю одну строку за один раз. Если это так, я хотел бы предложить вам установить следующие свойства на вашем QTableView:

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

Тогда я бы connect() к selectionChanged сигнала модели выбора:

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

Вот реализация гнездо:

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

Что такое «модель»? Нет метода index() для QItemSelectionModel ... –

+1

Модель является источником ваших данных. Вы сказали, что вы кормите свой QTableView из базы данных SQLite, возможно, это экземпляр [QSqlTableModel] (http://doc.trolltech.com/latest/qsqltablemodel.html) или [QSqlRelationalTableModel] (http: //doc.trolltech. ком/последний/qsqlrelationaltablemodel.html). В основном это то, что вы передаете 'ui-> tableView-> setModel()' как единственный параметр. –

+0

Ах, конечно! «QSqlTableModel», да. Спасибо за вашу помощь и извините за задержку в принятии. Теперь мой код выглядит намного чище. –

Смежные вопросы