gpt4 book ai didi

unit-testing - 使用 Qt Test 测试模态对话框

转载 作者:行者123 更新时间:2023-12-04 05:09:39 29 4
gpt4 key购买 nike

我正在尝试使用 QTestLib 为 GUI 应用程序编写单元测试。问题是其中一个插槽使用 exec() 创建了一个模态对话框。我发现无法与对话框进行交互。

创建对话框的插槽连接到 QAction。所以第一个问题是当我在测试中触发 QAction 时测试会阻塞,因为这会导致调用 exec() .因此,我尝试创建一个执行交互的 QThread。然而,这并没有帮助。

我已经尝试过的事情(都是在“交互助手”线程中执行的):

  • 使用 QTest::keyClicks() 发送按键点击
  • 导致错误消息“QCoreApplication::sendEvent():无法将事件发送到不同线程拥有的对象”
  • 使用 QCoreApplication::postEvent() 发布 QKeyEvents
  • 不起作用,即没有任何 react 。我猜是因为事件最终在拥有对话框的线程的事件循环中结束,直到对话框关闭和 exec() 才会到达该循环。返回。请参阅下面的编辑
  • 使用 QMetaObject::invokeMethod() 在对话框上调用插槽
  • 不起作用,即没有任何 react 。我想与 postEvent() 的原因相同不起作用。请参阅下面的编辑

  • 所以问题是:有没有办法以编程方式与使用 exec() 打开的模态对话框进行交互方法?

    编辑:实际上,方法3是有效的。问题是另一个问题:
    我将参数传递给 invokeMethod()到“交互助手”线程,由于某种原因,从该线程访问参数不起作用(我没有收到 SEG 错误,但它们只是空的)。
    我想方法 2 也有效,我只是遇到了与方法 3 相同的问题,但我没有测试。

    最佳答案

    我在使用用于 GUI 的 Qt 库的命令行应用程序中使用的解决方案是 singleShot , 如 this answer暗示。在这些情况下,它看起来像这样:

    QCoreApplication app(argc, argv);

    // ...

    QTimer::singleShot(0, &app, SLOT(quit()));
    return app.exec();

    所以在你的情况下,我想它看起来像这样:
    QDialog * p_modalDialog = getThePointer(); // you will have to replace this with
    // a real way of getting the pointer

    QTimer::singleShot(0, p_modalDialog, SLOT(accept()));

    p_modalDialog->exec(); // called somewhere else in your case
    // but it will be automatically accepted.

    关于unit-testing - 使用 Qt Test 测试模态对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9518484/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com