我正在使用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
发送事件来键入'hello'。但我可以直接向le
发送事件来做到这一点。
事情是,通常在自定义QWidget类中有许多私有窗口小部件成员。而且我无法通过将事件发送到实例来模拟键/鼠标事件。因为我无法将事件发送到其私有小部件。那么我该怎样做才能对这样的类进行自动测试呢?
环境:Gentoo Linux KDE Qt-4.8
答案 0 :(得分: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");
最后一个参数是延迟,有必要(你应该测试它)。
答案 1 :(得分:1)
最好的方法是为经过测试的小部件的子对象设置名称,然后通过此名称获取它们。
您还应该尝试将焦点放在此编辑器上。有很多方法可以做到这一点。
例如,通过调用nextInFocusChain
,直到您到达所需的编辑器并调用setFocus(Qt::MouseFocusReason);
获取私有部分的其他方法是子类和/或分叉构建用于测试,您可以在其中自由访问私有部分(可以为此准备一些宏)。