我有一个QTableView,它从SQLite数据库中提取位置列表和纬度/经度坐标。我想从用户在表中选择的行中提取纬度和经度,并使用以下代码,但它看起来相当复杂。也许我只是不了解如何充分利用Qt的模型/视图系统。我能以更清晰,更紧凑的方式编写这段代码吗?
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();
答案 0 :(得分:4)
我认为你的表看起来像这样:
+--------+--------+---------+ |Location|Latitude|Longitude| +--------+--------+---------+ | A | 11'.22"| 11'.22" | +--------+--------+---------+
从上面的代码中可以看出,我希望您的用户一次只能选择一行。
如果是这样,我建议您在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
}