【问题标题】:Qt UI testing: How to simulate a click on a QMenuBar item using QTest?Qt UI 测试:如何使用 QTest 模拟对 QMenuBar 项目的点击?
【发布时间】:2013-05-08 07:51:06
【问题描述】:

我正在尝试从 QMenuBar 模拟鼠标单击 QMenu 项目,例如使用 QTestLib 框架单击“另存为”QAction。

我正在 Windows XP 32 位和 Qt 5.0.2 下尝试这个。

有什么想法吗?

【问题讨论】:

  • 那会实现什么?只需致电QAction::trigger()
  • 我正在尝试为 UI 制作一个自动化测试应用程序。
  • 这基本上也是我想做的。我认为这里的复杂之处在于 QMenu 不会为每个 QAction 创建一个小部件:菜单项几乎只是直接绘制到菜单的矩形上。

标签: c++ qt qmenu qtestlib


【解决方案1】:

您应该使用QTest::mouseClick 函数。它将模拟对任何 QWidget 的点击。我发现尝试单击导致阻塞调用的 QMenu 不适用于单元测试。

【讨论】:

  • 不是一个好的答案,因为问题在于能够专门模拟对菜单的一个元素“另存为...”的点击。即使您可以模拟单击“文件”菜单按钮,也会显示菜单,菜单矩形中的某处是“另存为...”部分,但您如何模拟单击它?没有可访问的子小部件(或者有吗?)。
  • 这个答案是错误的。因为问题要求鼠标单击 QAction。但是 QAction 不继承自 QWidget。因此,这个解决方案是完全错误的。
【解决方案2】:

这个问题可能与问题所有者无关,但我想它可能对其他人有帮助。

QToolBar 不同,QMenu 没有方法widgetForAction。我为这种情况找到了一个简单的解决方法。如果没有任何反应,请尝试使用QTest::mouseClick 弹出菜单尝试使用QTest::keyClick(..., first_char_in_menu_tite, Qt::AltModifier)。要模拟操作执行,您可以使用Qt::Key_Down 导航到操作,直到您到达它,然后按Qt::Key_Enter。我想下面的代码可以帮助你理解

QMenu *menu = getMenu(mainWindow, menuName);
if (menu != nullptr) {
    QTest::keyClick(mainWindow, menu->title().at(1).toLatin1(), Qt::AltModifier);
}


QList<QAction *> actions = menu->actions();
foreach (QAction *action, actions) {
    if (action->objectName() == actionName) {
        QTest::keyClick(menu, Qt::Key_Enter);
        break;
    }
    QTest::qWait(1000);
    QTest::keyClick(menu, Qt::Key_Down);
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
相关资源
最近更新 更多