代码之家  ›  专栏  ›  技术社区  ›  Jake Petroules

qt:访问qTableView中的单元格

  •  0
  • Jake Petroules  · 技术社区  · 14 年前

    我有一个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 回复  |  直到 14 年前
        1
  •  4
  •   Ihor Kaharlichenko    14 年前

    我想你的桌子是这样的:

    +--------+--------+---------+
    |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
    }