【发布时间】:2012-03-01 15:01:14
【问题描述】:
我正在尝试使用 QTestLib 为 GUI 应用程序编写单元测试。问题是其中一个插槽使用exec() 创建了一个模态对话框,我发现无法与该对话框进行交互。
创建对话框的槽连接到一个 QAction。所以第一个问题是当我在测试中触发 QAction 时测试会阻塞,因为这会导致调用exec()。因此,我尝试创建一个执行交互的 QThread。然而,这并没有帮助。
我已经尝试过的事情(都在“交互助手”线程中执行):
- 使用
QTest::keyClicks()发送按键点击- 导致错误消息“QCoreApplication::sendEvent(): 无法将事件发送到不同线程拥有的对象”
- 使用
QCoreApplication::postEvent()发布 QKeyEvents-
不起作用,即没有任何反应。我猜是因为事件最终出现在拥有对话框的线程的事件循环中,直到对话框关闭并且请参阅下面的编辑exec()返回时才会到达。
-
- 使用
QMetaObject::invokeMethod()在对话框中调用插槽-
不起作用,即没有任何反应。我想与请参阅下面的编辑postEvent()不起作用的原因相同。
-
所以问题是:有没有办法以编程方式与使用exec() 方法打开的模式对话框进行交互?
编辑:实际上,方法 3 有效。问题是另一个问题:
我将invokeMethod() 的参数传递给“交互助手”线程,由于某种原因,从该线程访问参数不起作用(我没有收到 SEG 错误,但它们只是空的)。
我猜方法 2 也有效,我只是遇到了与方法 3 相同的问题,但我没有测试。
【问题讨论】:
-
为了防止 cmets:我知道我也可以使用
setModal(true)和show()创建对话框并异步处理返回值。但我的问题是明确针对exec()。
标签: unit-testing qt modal-dialog