尝试通过模拟事件在 QTableView 中进行编辑时,需要考虑以下几点:
QTableView 不直接显示其单元格,而是使用其视口() http://doc.qt.digia.com/4.6/qabstractscrollarea.html#viewport。同样,双击事件必须发送到视口而不是表视图本身。
现在当你这样做时
QTest::mouseDClick( m_pTableView->viewport(), Qt::LeftButton,
NULL, QPoint( xPos, yPos ) );
该单元格将被选择,但不会处于编辑模式(与人为启动的双击不同,即使表格视图之前没有焦点,也会立即将单元格置于编辑模式)。但是,如果您在双击之前在同一位置添加单击,那么它将起作用!
如果您随后将 [End] 按键发送到视口,则光标不会跳转到表格单元格内容的末尾,而是会选择当前行中的最后一个单元格。
为了更改表格单元格内容,您必须将事件发送到当前编辑器小部件。最简单的方法是使用QWidget::focusWidget() http://doc.qt.digia.com/4.6/qwidget.html#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() 函数here http://doc.qt.digia.com/4.6/qtestlib-tutorial2.html,请注意,您无法在创建数据时检索 focusWidget()。
我通过创建自定义界面解决了这个问题ITestAction
只有一个纯虚拟的“execute()”函数。然后我添加了具有类似构造函数的子类QTest::mouseClick(...) etc
功能。这些类只是调用 QTest 函数,但使用小部件本身或其焦点小部件作为参数,具体取决于附加的布尔标志。
然后,_data() 槽为每个数据行存储一个 QList,实际的测试槽会迭代该列表,并在执行验证之前对每个项目调用execute()。