0

QTable内部のセルを編集して のQDialog「OK」ボタンを押すとQDialog、セルの値は何もありません(編集前に何もなかった場合)。OkButtonしたがって、 (つまり)のスロットでは、 内OkButton->clicked()のすべてのセルの値にアクセスしますQTable。ただし、最後に編集されたセルはまだ入力されていません。変!

QTableを押す前に別の場所をクリックOkButtonすると、正常に動作します。つまり、最後に編集したセルの値を で確認できますQTable->text(row, col)。この動作の原因となる、ここで何が欠けているかを理解するのを手伝ってもらえますか?

もう 1 つの興味深い動作: のスロットではOkButton、値が見つからないため、 を呼び出しますQMessageBox::information()。デバッグ中に、このステートメントで「次へ」(gdb で) と言うと、valueChanged()シグナルが発せられます (キャッチして出力しています)。この信号が遅れている理由がわかりません。変更された値を以前に記録しなかったのはなぜQTableですか??

4

2 に答える 2

1

利用可能なqt3はありませんが、Qt4.6のQTableViewで同様の問題が発生しました。

関数endEdit(row、col、true、false)を呼び出さなければならない場合があります:

void QTable :: endEdit(int row、int col、bool accept、bool replace)[仮想保護]

この関数は、行のセルのインプレース編集、colの停止が要求されたときに呼び出されます。セルが編集されていないか、acceptがFALSEの場合、関数は戻り、セルの内容は変更されません。

acceptがTRUEの場合、エディターのコンテンツを関連するセルに転送する必要があります。replaceがTRUEの場合、このセルの現在のコンテンツをエディターのコンテンツに置き換える必要があります(これは、セルの現在のQTableItemを削除し、セル用に新しいQTableItemを作成することを意味します)。それ以外の場合(可能な場合)、エディターのコンテンツは、このセルの既存のQTableItemに設定する必要があります。

私の場合はcommitData()を呼び出す必要がありましたが、これは同じ仕事をしているようです。

于 2012-03-29T14:19:34.323 に答える
0

考えられる解決策の1つは、何らかの方法でendEdit()をトリガーすることです。私が採用した方法は、OkButtonのハンドラー/スロットから次のコードを取得することです。

mTable->setEnabled(false);  // wil trigger endEdit()
mTable->setEnabled(true);
// Access mTable's cells now
QString cell_content = mTable->text(i, j);

このコードは問題を解決しました。

于 2012-03-29T15:19:32.300 に答える