シミュレートされたイベントを通じて QTableView を編集しようとする場合、考慮すべき点がいくつかあります。
QTableView は、そのセルを直接表示するのではなく、そのviewport()を使用して表示します。同様に、ダブルクリック イベントは、テーブル ビュー自体ではなく、ビューポートに送信する必要があります。
今あなたがするとき
QTest::mouseDClick( m_pTableView->viewport(), Qt::LeftButton,
NULL, QPoint( xPos, yPos ) );
セルは選択されますが、編集モードではありません (以前にテーブル ビューにフォーカスがなかった場合でも、セルを即座に編集モードにする人間が開始したダブル クリックとは異なります)。ただし、ダブルクリックの前に同じ場所にシングルクリックを追加すると、機能します!
[End] キーを押してビューポートに送信すると、カーソルはテーブル セル コンテンツの最後にジャンプせず、現在の行の最後のセルが選択されます。
テーブル セルのコンテンツを変更するには、代わりに現在のエディター ウィジェットにイベントを送信する必要があります。これを行う最も簡単な方法は、QWidget::focusWidget()を使用することです。
QTest::keyClick( m_pTableView->viewport()->focusWidget(), Qt::Key_End );
focusWidget() が NULL を返す可能性があるため、そのように使用すると安全ではない可能性があることに注意してください。
その知識があれば、テスト ケースは次のようにプログラムできます。
// Note: The table view must be visible at this point
// Retrieve X/Y coordinates of the cell in the third column and the fourth row
int xPos = m_pTableView->columnViewportPosition( 2 ) + 5;
int yPos = m_pTableView->rowViewportPosition( 3 ) + 10;
// Retrieve the viewport of the table view
QWidget* pViewport = m_pTableView->viewport();
// Double click the table cell to set it into editor mode
// Note: A simple double click did not work, Click->Double Click works, however
QTest::mouseClick ( pViewport, Qt::LeftButton, NULL, QPoint( xPos, yPos ) );
QTest::mouseDClick( pViewport, Qt::LeftButton, NULL, QPoint( xPos, yPos ) );
// Simulate [End] keypress
QTest::keyClick( pViewport->focusWidget(), Qt::Key_End );
// Simulate [5] keypress
QTest::keyClick( pViewport->focusWidget(), Qt::Key_5 );
(注: これを確認したい場合は、各イベントの後に QTest::qWait( 1000 ) コマンドを追加できます)
ここで説明されているように _data() 関数を使用している場合、データ作成時に focusWidget() を取得できないことに注意してください。ITestAction
純粋な仮想「execute()」関数のみを使用してカスタム インターフェイスを作成することで、この問題を解決しました。QTest::mouseClick(...) etc
次に、関数と同様のコンストラクターを持つサブクラスを追加しました。これらのクラスは単に QTest 関数を呼び出しますが、追加のブール値フラグに応じて、ウィジェット自体またはそのフォーカス ウィジェットをパラメーターとして使用します。次に、_data() スロットは各データ行の QList< ITestAction* > を格納し、実際のテスト スロットはそのリストを反復処理し、検証が実行される前に各項目で execute() を呼び出します。