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 Comentarios

  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.

Dejar respuesta

Please enter your comment!
Please enter your name here