Qt UI测试:如何使用QTest模拟单击QMenuBar项目?

11
我试图使用QTestLib框架在QMenuBar上模拟鼠标单击QMenu项,例如单击"Save As" QAction。 我正在Windows XP 32位和Qt 5.0.2下尝试此操作。有什么想法吗?

那会实现什么?只需调用 QAction::trigger() - cmannett85
我正在尝试为用户界面制作一个自动化测试应用程序。 - Popovici Silviu
这基本上也是我想做的。我认为这里的复杂性在于QMenu没有为每个QAction创建小部件:菜单项几乎直接绘制在菜单的矩形上。 - fatuhoku
2个回答

8

也许这个问题对提问者不相关,但我认为它可能有助于其他人。

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);
}

我在这里为QComboBox制作了一个类似的示例。感谢您发布QMenu的示例!https://gist.github.com/peteristhegreat/cbd8eaa0e565d0b82dbfb5c7fdc61c8d - phyatt

-2

你应该使用QTest::mouseClick函数。它可以模拟对任何QWidget的点击。我发现,尝试在导致阻塞调用的QMenu上进行单元测试将无法正常工作。


2
这不是一个好的答案,因为问题在于能否模拟点击菜单中特定的一个元素,“另存为...”。即使您可以模拟点击“文件”菜单按钮,然后显示菜单,在菜单矩形的某个位置上有“另存为...”部分,但如何模拟点击它呢?没有子窗口小部件可供访问(或者有吗?)。 - user405
这个答案是错误的。因为问题要求在QAction上进行mouseClick。但是QAction没有继承自QWidget。因此,这个解决方案完全是错误的。 - LAL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接