Qt:访问QTableView中的单元格

时间:2010-08-21 22:25:47

标签: qt model-view

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

1 个答案:

答案 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
}