使用新值更新QTableView中的单元格

时间:2011-01-14 21:43:17

标签: c++ qt qtableview

3 个答案:

答案 0 :(得分:4)

如果您在自定义数据模型中(可能继承自QAbstractTableModel,因为我们正在讨论QTableView),您可以通知视图已发生数据更改发出QAbstractItemModel::dataChanged()信号。

这是我如何做的。

更新整行:

QModelIndex startOfRow = this->index(row, 0);
QModelIndex endOfRow   = this->index(row, Column::MaxColumns);

//Try to force the view(s) to redraw the entire row.
emit QAbstractItemModel::dataChanged(startOfRow, endOfRow);

更新整个列,但仅更新Qt :: DecorationRole:

QModelIndex startOfColumn = this->index(0, mySpecificColumn);
QModelIndex endOfColumn = this->index(numRows, mySpecificColumn);

//Try to force the view(s) to redraw the column, by informing them that the DecorationRole data in that column has changed.
emit QAbstractItemModel::dataChanged(startOfColumn, endOfColumn, {Qt::DecorationRole});

通过向项目模型添加UpdateRow(行)和UpdateColumn(列)等便利函数,如果从外部更改数据,则可以从模型本身外部调用这些函数。

您不想告诉视图更新自己 - 如果有多个视图查看同一模型该怎么办?让模型通知所有附加的视图它已更改。

答案 1 :(得分:1)

如果有人遇到同样的问题,这是我使用的代码。

connect(ui->tableView->model(),SIGNAL(dataChanged(QModelIndex,QModelIndex)),SLOT(UpdateData(QModelIndex,QModelIndex)));



void MainWindow::UpdateData(const QModelIndex & indexA, const QModelIndex & indexB)
{
    int col = indexA.column();
    int fila = indexA.row();

    if(col == 1 || col == 3)
    {
        double valor1 = ui->tableView->model()->data(ui->tableView->model()->index(fila,1)).toDouble();
        double valor2 = ui->tableView->model()->data(ui->tableView->model()->index(fila,3)).toDouble();
        ui->tableView->model()->setData(ui->tableView->model()->index(fila ,col + 1),2.0*valor1);
        ui->tableView->model()->setData(ui->tableView->model()->index(fila,col + 3),(200.0*valor1/valor2));
    }
}

这将更新依赖于已更新的另一个单元格的单元格值。

答案 2 :(得分:0)

由于以下几个原因,这似乎是相当混乱的方法:

  1. 如果您希望在不同的列中显示相同的值,或者您有一个依赖于另一列的值的列,那么您应该相应地设计为该视图提供的模型。
  2. 您正在调用的setData是一个纯虚函数,它在模型中实现。因此,您可能希望修改setData实现,而不是按下Enter / Return键并按下它们。因为这种方式的另一个所有模型更改都通过此功能。别忘了为你改变的索引发出dataChanged信号。