0

我有一个 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();
4

1 回答 1

4

我假设您的表格如下所示:

+--------+--------+---------+
|位置|纬度|经度|
+--------+--------+---------+
| 一个 | 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
}
于 2010-08-21T23:18:49.147 回答