答案 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);
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)
由于以下几个原因,这似乎是相当混乱的方法: