gpt4 book ai didi

qt - 如何从 QTest 单元测试编辑 QTableView 单元格?

转载 作者:行者123 更新时间:2023-12-02 04:04:02 25 4
gpt4 key购买 nike

我正在使用 QTestLib framework 在 QTableView 中为自定义验证器编写单元测试。最基本的测试用例之一可以这样描述:

Double click the table cell in the third column and the fourth row, and append the number '5' to its content.

仅仅更改模型中的值或其他内容是不够的,测试用例应像这样执行:

  1. 双击表格单元格将其设置为编辑模式
  2. 按[结束]键。
  3. 按 [5] 键。

注:This question有关于如何从代码将表格单元格设置为编辑模式的答案,但是单元测试应尝试坚持人类用户的可能性,即鼠标/键盘操作。

我发现可以使用 QTableView::columnViewportPosition( int ) 检索单元格的 X/Y 位置和 QTableView::rowViewportPosition( int ) 。但是,使用 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 下尝试此操作

最佳答案

尝试通过模拟事件在 QTableView 中进行编辑时需要考虑以下几点:

QTableView 不直接显示其单元格,而是使用其 viewport() 来显示其单元格。 。同样,双击事件必须发送到视口(viewport)而不是 TableView 本身。

现在当你这样做

QTest::mouseDClick( m_pTableView->viewport(), Qt::LeftButton, 
NULL, QPoint( xPos, yPos ) );

单元格将被选择,但不会处于编辑模式(与人为启动的双击不同,即使表格 View 之前没有焦点,也会立即将单元格置于编辑模式)。但是,如果您在双击之前在同一位置添加单击,那么它将起作用!

如果您随后将 [End] 按键发送到视口(viewport),光标将不会跳转到表格单元格内容的末尾,而是会选择当前行中的最后一个单元格。
为了更改表格单元格内容,您必须将事件发送到当前编辑器小部件。最简单的方法是使用 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() 函数 here ,请注意,您无法在创建数据时检索 focusWidget()。我通过创建一个仅包含纯虚拟“execute()”函数的自定义接口(interface) ITestAction 解决了这个问题。然后,我添加了具有与 QTest::mouseClick(...) 等函数类似的构造函数的子类。这些类只是调用 QTest 函数,但使用小部件本身或其焦点小部件作为参数,具体取决于附加的 bool 标志。然后,_data() 槽为每个数据行存储一个 QList< ITestAction* >,实际的测试槽会迭代该列表,并在执行验证之前对每个项目调用execute()。

关于qt - 如何从 QTest 单元测试编辑 QTableView 单元格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12604739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com