2

我正在使用qtestlib. 在下面的示例代码中:

#include <QtTest/QtTest>

QWidget *win = new QWidget;
QLabel *label = new QLabel("&what");
QLineEdit *le = new QLineEdit;
label->setBuddy(le);

QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(label);
layout->addWidget(le);
win->setLayout(layout);
win->show();

QTestEventList events1, events2;
events1.addKeyClick(Qt::Key_W, Qt::AltModifier);
events1.addKeyClicks("hello");
events1.addDelay(1000);
events1.simulate(win); // didn't type 'hello'

events2.addKeyClicks("world");
events2.addDelay(1000);
events2.simulate(le); // did type 'world'

我不能通过le向其父小部件发送事件来获得焦点并输入“你好” win。但我可以通过le直接发送事件来做到这一点。

事情是通常在自定义 QWidget 类中有许多私有小部件成员。而且我无法通过将事件发送到实例来模拟键/鼠标事件。当然,我不能将事件发送到它的私有小部件。那么我该怎么做才能对此类进行自动测试呢?

环境:Gentoo Linux KDE Qt-4.8

4

2 回答 2

1

现在肯定找到解决方案:

  QTest::keyClick(win, Qt::Key_F, Qt::AltModifier,500);
  QTest::keyClicks(win->focusWidget(),"blah");
  QTest::keyClick(win, Qt::Key_W, Qt::AltModifier,500);
  QTest::keyClicks(win->focusWidget(),"blah2");

在此处输入图像描述

最后一个参数是延迟,它是必要的(你应该测试它)。

于 2013-11-14T12:42:39.187 回答
1

最好的方法是为被测小部件的子对象设置名称,然后通过该名称获取它们。

您还应该尝试将重点放在此编辑器上。有很多方法可以做到这一点。例如,通过调用nextInFocusChain直到您到达所需的编辑器和调用setFocus(Qt::MouseFocusReason);

获取私有部分的其他方法是子类和/或用于测试的分叉构建,您可以在其中自由访问私有部分(可以为此准备一些宏)。

于 2013-11-14T14:37:08.437 回答