Pregunta

Soy nuevo, estoy aprendiendo a programar en Qt y mi Inglés no es muy buena, mi problema es que cuando actualizo una celda de una QTableView utilizar su valor en otra célula, se utiliza el valor anterior y no el nuevo, les muestro el código 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;
}
¿Fue útil?

Solución

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

  1. Si desea que el mismo valor que se ha presentado en diferentes columnas, o si tiene una columna que depende del valor de otra columna, entonces probablemente debería diseñar de acuerdo con el modelo que se alimenta de la vista.
  2. setData que está llamando es una función virtual pura, que se implementa en el modelo. Así que en lugar de la captura de pulsaciones de teclas Intro / Retorno y actuar sobre ellos es posible que desee modificar la aplicación setData. Debido a esta forma de otra pasan todos los cambios en el modelo a través de esta función. No se olvide de emitir señales DataChanged para los índices que cambie.

Otros consejos

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

Así es como lo hago.

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

Actualización de una columna entera, 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 confort como UpdateRow (fila) y UpdateColumn (columna) para el modelo de elemento, puede llamar a esas funciones desde fuera del modelo en sí, si cambia los datos de forma externa.

Usted no quiere contar una vista para actualizarse a sí mismo - lo que si hay más de una vista mirando al mismo modelo? Dejar que el modelo para informar a todos los puntos de vista adjuntos que ha cambiado.

Este es el código que uso si alguien tenía 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 célula que ha sido actualizada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top