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

2024-01-11

我正在使用 QTableView 为自定义验证器编写单元测试QTestLib框架 http://doc.qt.digia.com/4.6/qtestlib-manual.html。最基本的测试用例之一可以这样描述:

双击第三列第四行的表格单元格,并将数字“5”附加到其内容中。

简单地更改模型或任何内容中的值是不够的,测试用例应像这样执行:

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

Note: 这个问题 https://stackoverflow.com/questions/3681326/how-to-trigger-the-edit-mode-of-an-item-in-a-qtableview有关于如何从代码将表格单元格设置为编辑模式的答案,但是单元测试应尝试坚持人类用户的可能性,即鼠标/键盘操作。

我发现可以使用以下命令检索单元格的 X/Y 位置QTableView::columnViewportPosition( int ) http://doc.qt.digia.com/4.6/qtableview.html#columnViewportPosition and QTableView::rowViewportPosition( int ) http://doc.qt.digia.com/4.6/qtableview.html#rowViewportPosition。 但是,使用双击指定位置QTest::mouseDClick(...) http://doc.qt.digia.com/4.6/qtest.html#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 不直接显示其单元格,而是使用其视口() 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()。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 QTest 单元测试编辑 QTableView 单元格? 的相关文章

  • Qt 远程文件浏览器

    我想知道是否有人使用过 Qt 远程文件浏览器 根据我的理解 我有两个选择 当涉及到远程文件时 将 QFileDilaog 与自定义代理模型结合使用 该模型将负责提供远程文件 目录结构 使用自定义对话框 并为本地文件提供标准文件系统模型 为远
  • 如何使用 Qt Test 控制 QFileDialog?

    我有两个问题 我怎样才能访问QFileDialog并使用 Qt Test 模块在 文件名 字段中写入文件的路径 我这么问是因为我正在 Qt 中开发一些 GUI 测试 现在我需要打开一个文本文件 以下代码创建QFileDialog并获取文件路
  • 如何在 QTableWidget 的行和列中自动换行文本?

    I tried QTableWidget j new QTableWidget 10000 5 centralWidget j gt setColumnWidth 0 500 j gt setColumnWidth 1 30 j gt se
  • 如何在Qt中设置编译器?

    我对 Qt 完全陌生 我下载了离线版本 Qt 5 3 2 for Windows 64 bit VS 2013 OpenGL 573 MB 我无法编译我的项目 I have Qt Creator 3 2 1 开源 基于Qt 5 3 2 MS
  • 在哪里可以找到 Qt 的 dll 的 pdb 文件?

    我正在调试 Qt 应用程序 在哪里可以找到 Qt 的调试 dll 我在windows上使用的是vs2010 它说它需要 Qt 中的许多 dll 的 pdb 文件 从 Qt 5 9 开始 与 Windows 发行版相对应的 PDB 可作为单独
  • 获取小部件的背景颜色 - 真的

    我无法获取小部件的实际背景颜色 在我的特殊情况下 我在使用 QTabWidget 中的小部件时遇到问题 这是在Windows7上 因此 经典的小部件有一些灰色背景 而选项卡内的小部件通常用白色背景绘制 I tried def bgcolor
  • 我的 QSqlQueryModel 不在列表视图中显示数据

    我正在玩 QSqlQueryModel 但我现在完全陷入困境 我一整天都在寻找解决方案 但到目前为止还没有运气 我所做的工作是它从我的 sqlite 数据库中提取数据 但由于某种原因我无法在列表视图中显示它 我的角色名似乎不存在 对于我从数
  • Qt GUI 编程设计

    我正在尝试创建一个 GUI 应用程序 主窗口 一个QMainWindow 包含 9 个固定大小的标签以及主窗口的大小 我尝试在没有 Qt GUI Designer 的情况下以编程方式制作它 该项目构建时没有错误 但我看不到主窗口上显示的任何
  • QLineEdit:显示处理后的文本,而不是输入的文本,但保留它(自定义回显模式)

    我想要一个QLineEdit不显示输入的文本 而是显示经过处理的版本 同时保留原始文本并在通过请求时返回它text 就像密码回显模式一样 但我不希望每个字符都被屏蔽 我想虚拟化空间 例如什么时候some text with spaces i
  • QT 中只获取文件而不获取目录?

    当我这样做时 QDir myDir home some location QStringList filesList myDir entryList 它返回该位置内的文件和目录 但我只想要文件 并且这些文件可以具有任意扩展名 有任何想法吗
  • Qt 支持在 QIcon 中为 SVG 着色

    看来 Qt 不支持 SVG 中路径标签上的描边 填充选项
  • QTableView 中的虚拟列?

    我开始学习 Qt4 模型 视图编程 我有初学者问题 我有一个简单的应用程序 其中显示 sqlite 表QTableView class Model QtSql QSqlTableModel def init self parent None
  • 如何在 Qt-Embedded 中(正确)输出多语言文本?

    我的目标系统是 linux 3 3 7 Qt Embedded 开源版 4 8 Droid 字体 取自 fonts droid 20111207 git 1 all deb Debian 软件包并复制到 usr lib fonts目录 主要
  • 如何在 C++ 和 QML 应用程序中使用 qrc?

    我在 Windows7 上用 c qnd Qt Creator QML 编写了 Qt Quick Desktop 应用程序 现在 我必须部署它 并且我需要隐藏 qml 文件和图像 意味着 将它们放入资源等中 我读到有一个很好的方法可以使用
  • 使用 cmake 将两种解决方案合二为一

    我有两个单独的 Visual Studio 2013 解决方案 我想将它们迁移到一个解决方案中 因为第一个解决方案 使用 Qt 充当第二个解决方案的 GUI 最后 我希望有一个结构如下的单一解决方案 Solution All Build P
  • 当我尝试构建 Qt 4.7.1 静态库时,“找不到 -ljscore”

    我尝试从最新的源构建静态 Qt 库 但出现以下错误 usr bin ld cannot find ljscore collect2 ld returned 1 exit status 如何解决这个问题呢 这是 Qt 构建系统中自 4 7 0
  • Qt:将拖放委托给子级的最佳方式

    我在 QWidget 上使用拖放 我重新实现了 DragEnterEvent dragLeaveEvent dragMoveEvent 和 dropEvent 效果很好 在我的 QWidget 中 我有其他 QWidget 子级 我希望它们
  • Qt 创建者 + MITK (Linux)

    我正在尝试使用MITK 与 Qt Creator 我已经通过 ccmake 成功编译并使用了 VTK 和 ITK 我已经编译了 MITK超级建造模式 它下载 CTK VTK ITK 等 然后我就配置好了 我已经用 make 编译了 大约两个
  • QTcpSocket 有时不发送数据

    我有两个 QT 应用程序 一个应用程序可以被认为保存了大数据 它每秒向第二个应用程序发送大约 10 KB 的数据块 之前我尝试使用QUdpSocket来传输数据 但由于MTU限制在2 5K左右 并且需要自己分割和重新组合数据 所以我改用QT
  • 错误 LNK2001:无法解析的外部符号 __CxxFrameHandler3

    我正在将 Qt 从 VS 2013 迁移到 Qt 5 10 1 到 VS 2015 出现以下多个链接错误 error LNK2001 unresolved external symbol CxxFrameHandler3 error LNK

随机推荐