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

カスタムデータモデル内にいる場合( sQAbstractTableModelについて説明しているので、おそらくから継承します)、 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

これは、誰かが同じ問題を抱えている場合に私が使用するコードです。

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

これにより、更新された別のセルに依存するセル値が更新されます。

于 2011-01-15T00:25:29.213 に答える
0

これは、いくつかの理由から、これを行うための非常に難しいアプローチのようです。

  1. 同じ値を異なる列に表示する場合、または別の列の値に依存する列がある場合は、ビューにフィードするモデルをそれに応じて設計する必要があります。
  2. 呼び出しているsetDataは純粋仮想関数であり、モデルに実装されています。したがって、Enter / Returnキーの押下をキャッチして操作する代わりに、setDataの実装を変更することをお勧めします。別のこの方法では、すべてのモデル変更がこの関数を通過するためです。変更するインデックスのdataChangedシグナルを発行することを忘れないでください。
于 2011-01-14T22:33:17.500 に答える