9

QTestLib フレームワークを使用して、QTableView でカスタム Validator の単体テストを作成しています。最も基本的なテスト ケースの 1 つは、次のように記述できます。

3 列目と 4 行目の表のセルをダブルクリックし、その内容に数字「5」を追加します。

モデルの値などを単に変更するだけでは十分ではありません。テスト ケースは次のように実行する必要があります。

  1. 表のセルをダブルクリックして編集モードにします
  2. [終了]キーを押します。
  3. [5]キーを押します。

注:この質問には、コードからテーブル セルを編集モードに設定する方法に関する回答がありますが、単体テストでは、人間のユーザーの可能性、つまりマウス/キーボード アクションに固執しようとします。

QTableView::columnViewportPosition( int )QTableView::rowViewportPosition( int )を使用して、セルの X/Y 位置を取得できることがわかりました。ただし、QTest::mouseDClick(...)を使用して指定された場所をダブルクリックしても、セルは選択されず、編集モードにも設定されません。

// Retrieve X/Y coordinates of the cell in the third column and the fourth row
int xPos = m_pTableView->columnViewportPosition( 2 );
int yPos = m_pTableView->rowViewportPosition( 3 );

// This does not work
QTest::mouseDClick( m_pTableView, Qt::LeftButton, QPoint( xPos, yPos ) );

マウス/キーボード アクションのみを使用して、上記で説明したテスト ケースを実装するにはどうすればよいですか?

PS: Windows XP 32 ビットおよび Qt 4.6.1 でこれを試しています。

4

1 に答える 1

11

シミュレートされたイベントを通じて 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() を呼び出します。

于 2012-09-26T15:03:11.407 に答える