Actualización de la célula en QTableView con el nuevo valor

Soy nuevo, estoy aprendiendo a programar en Qt y mi inglés no es muy bueno, mi problema es que cuando actualizo una celda en una QTableView para usar su valor en otra celda, se utiliza el valor anterior y no el nuevo, yo les muestro el código de como lo estoy haciendo, gracias.

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;
}
InformationsquelleAutor Ricky | 2011-01-14

3 Kommentare

  1. 0

    Esto parece ser bastante ditry enfoque a hacer esto por varias razones:

    1. Si desea que el mismo valor para ser presentada en diferentes columnas, o tiene una columna que depende del valor de otra columna, entonces usted probablemente debería diseño en consecuencia, el modelo que se alimenta de la vista.
    2. setData que se llama a una función virtual pura, que es implementado en el modelo. Así que en lugar de la captura tecla Enter/Return prensas y actuar sobre ellos puede modificar el setData aplicación. Porque esta forma de otro todos los cambios en el modelo pasar a través de esta función. No te olvides de emitir dataChanged señales de los índices que cambiar.
    • muchas gracias, siga las instrucciones para el uso dataChange de la señal.
  2. 4

    Si está dentro de un custom modelo de datos, (tal vez la herencia de QAbstractTableModel, ya que estamos hablando de QTableViews), usted puede informar a la opinión de que un cambio de los datos se ha producido por la emisión de la QAbstractItemModel::dataChanged() de la señal.

    He aquí cómo yo lo hago.

    De la actualización de una fila entera:

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

    La actualización de toda la columna, pero sólo el 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});

    Mediante la adición de funciones de conveniencia como UpdateRow(fila) y UpdateColumn(columna) en su artículo modelo, usted puede llamar a esas funciones desde fuera del modelo en sí, si cambia los datos externamente.

    No quieres decirle a un ver a la actualización de sí mismo – ¿y si hay más de una vista del mismo modelo? Deje que el modelo para informar a todos los conectados vistas que ha cambiado.

  3. 1

    Este es el código que uso si alguien tuvo el mismo problema.

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

    Esto actualizará el valor de la celda que depende de otra celda que ha sido actualizado.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea