2013-11-14 104 views
2

我正在使用qtestlib编写一些自动测试代码。在下面的示例代码:QTest无法将事件传递给子窗口小部件

#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' 

我不能让通过事件发送到它的父控件winle获得焦点和类型“你好”。但我可以通过直接发送活动到le来实现。

事情通常是在自定义QWidget类中有许多私人小部件成员。我无法通过将事件发送到实例来模拟键/鼠标事件。因为我无法将事件发送到其私人小部件。那么我能做些什么来对这样的类进行自动测试呢?

环境:的Gentoo Linux的KDE的Qt 4.8

回答

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

enter image description here

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

+0

在实际的代码中,我使用'QTestEventList'来模拟。我只是添加一些'addDelay()'来检查结果。 –

+0

就是这样!而'达赖= 1'似乎也奏效了。但我担心它是机器/平台指定的。所以仍然想知道测试这样一个小部件的* universal *练习。 –

+0

它适用于Windows 7 Professional Qt 5.1.1 creator 2.8.1 – kajojeq

1

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

你也应该尝试着重于这个编辑器。有很多方法可以做到这一点。 例如通过调用nextInFocusChain直到你达到所希望的编辑和调用setFocus(Qt::MouseFocusReason);

其他方式获得的私处是子类化和/或分叉构建测试,你可以自由地访问私处(也可以准备一些宏为了那个原因)。

+0

我认为“set name”方法非常棒。但对于分叉测试子对象是我想逃避。因为这样做很难在测试代码和生产代码之间同步。 –

+0

'setObjectName'很棒,因为有工具(我不记得名字),在那里你可以编写Ruby脚本来执行整个应用程序的功能测试。您也可以添加友谊,以转发宣称的测试类,以便能够访问测试中的私人部分。 –

相关问题