4

我是新手,我正在学习 Qt 编程,我的英语不是很好,我的问题是当我更新 QTableView 中的一个单元格以在另一个单元格中使用它的值时,它使用以前的值而不是新的,我向他们展示我正在做的代码,谢谢。

bool MainWindow::eventFilter(QObject * watched, QEvent * event)
{
    if(event->type() == QEvent::KeyPress)
    {
        QKeyEvent *ke = static_cast<QKeyEvent *>(event);
        qDebug() << ke->type();
        if(ke->key() == Qt::Key_Enter || ke->key() == Qt::Key_Return)
        {
            int fila = ui->tableView->currentIndex().row();
            int col = ui->tableView->currentIndex().column();
            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();
            if(col == 1 || col == 3)
            {
                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);
            }
        }
    }

return false;
}
4

3 回答 3

6

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

这是我的做法。

更新整行:

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(row) 和 UpdateColumn(column) 等便利函数添加到您的项目模型,如果您从外部更改数据,您可以从模型本身外部调用这些函数。

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

于 2014-04-24T03:24:15.097 回答
1

This is the code that I use if anyone had the same problem.

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));
    }
}

This will update the cell value that depends on another cell that has been updated.

于 2011-01-15T00:25:29.213 回答
0

出于以下几个原因,这似乎是一种非常简单的方法:

  1. 如果您希望在不同的列中显示相同的值,或者您的列依赖于另一列的值,那么您可能应该相应地设计提供视图的模型。
  2. 您调用的 setData 是一个纯虚函数,在模型中实现。因此,您可能需要修改 setData 实现,而不是捕获 Enter/Return 按键并对其进行操作。因为这种方式的另一种所有模型的变化都通过这个函数。不要忘记为您更改的索引发出 dataChanged 信号。
于 2011-01-14T22:33:17.500 回答