2012-03-29 10 views
0

QDialogの中のQTableのセルを編集し、「ok」ボタンQDialogを押すと、そのセルの値は何もありません(編集前のものでなかった場合)。したがって、OkButton(つまりOkButton->clicked())のスロットでは、QTableのすべてのセルの値にアクセスします。ただし、最後に編集されたセルはまだ塗りつぶされていません。奇妙な!QTableは最後に編集されたセルに対してどのように動作しますか?

OkButtonを押す前にQTableのどこかをクリックすると、正常に動作します。つまり、最後に編集したセルの値がQTable->text(row, col)で表示されます。 誰かが、この現象が発生する原因がここにないことを理解するのを助けてくれますか?

もう1つの興味深い動作:OkButtonのスロットに値が見つからないため、QMessageBox::information()と呼び出します。デバッグ中に、この文で 'next'(gdbで)と言うと、valueChanged()シグナルが出力されます(私はそれを捕まえて印刷しています)。なぜこの信号が遅れているのか分かりません。なぜQTableが以前に変更された値を記録しなかったのですか?

答えて

0

可能な解決策の1つは、何とかendEdit()をトリガーすることです。私が採用したメソッドは、OkButtonのハンドラ/スロットから次のコードを持つことです。

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

1

私はqt3を利用できませんが、私はQt 4.6のQTableViewと同様の問題がありました。

あなたが機能endEdit(row,col,true,false)を呼び出すために必要がある場合があります:

無効QTable :: endEdit(int型の列、int型コル、ブール受け入れ、ブール値置き換え)[保護された仮想]

この関数が呼び出されます行内のセルのインプレイス編集では、列を と停止する必要があります。セルが編集されていないか受け入れられている場合は、 FALSEが返され、セルの内容は変更されません。

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

私の場合はcommitData()に電話しなければならなかったが、これは同じ仕事をするようだ。

+0

問題は、endEditを呼び出す場所が適切でないことです。私はこれのためだけにサブクラス化したくなかった(どちらも助けにならなかったかもしれない)。私は非常に良い別の回避策を見つけました。私は答えとして下にそれを与えました。 – bbv

関連する問題