gpt4 book ai didi

c++ - 如何使用 Qt Test 控制 QFileDialog?

转载 作者:行者123 更新时间:2023-11-30 05:24:05 25 4
gpt4 key购买 nike

我有两个问题:

  1. 如何使用 Qt 测试模块访问 QFileDialog 并在“文件名”字段中写入文件路径?

    我问这个是因为我正在 Qt 中开发一些 GUI 测试,现在我需要打开一个文本文件。以下代码创建 QFileDialog 并获取文件路径:

    QString filePath = QFileDialog::getOpenFileName(
    this,
    "Open",
    "",
    tr("Text Files (*.txt)") );
  2. 如果我使用线程 (QThread) 加载此文本文件中的内容,我如何才能等待此线程在我的 GUI 测试中完成?

    我知道我可以使用 QTest::qSleep( milliseconds ); 命令,但我认为在这种情况下这不是一个好的做法。

如果可能的话,请给我一个例子。

最佳答案

  1. 遗憾的是,无法使用 Qt 测试模块。您有多种选择:

    1. 添加绕过该对话框的测试 Hook :您需要检测代码以使其可测试。你可以例如在请求文件的对象上设置一个 testFile 属性到文件路径,如果设置了该属性,则对象可以跳过请求文件。

      const char k_testFile[] = "k_testFile";

      MyClass::foo() {
      ...
      auto testFile = property(k_testFile);
      auto filePath = testFile.isNull()
      ? QFileDialog::getOpenFilePath(...)
      : testFile.toString();
      ...
      }
    2. 使用非 native 对话框,然后它是一个普通的小部件,您可以使用 Qt Test 对其进行测试。

    3. 使用特定于平台的方式查找 native 对话框并与之交互。您需要为您打算测试的每个平台实现它。

  2. 您应该在文件加载后发出信号。测试可以等待该信号。您甚至不需要使用显式线程来加载文件,异步加载文件的惯用方式是:

    QString filePath = ...;
    QtConcurrent::run(ioPool, [this, filePath]{
    auto data = MyLoader::load(filePath);
    emit haveFileData(data);
    });

    您在其中调用此代码的类应该有一个 haveFileData 信号,表示一些其他代码连接到该代码并按需要进行处理。 ioPool 是用于 I/O 绑定(bind)操作的线程池,如果您希望全局池成为 I/O 池,它可以是 QThredPool::globalInstance() . CPU 和 I/O 绑定(bind)的线程池应该是分开的。

关于c++ - 如何使用 Qt Test 控制 QFileDialog?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38858700/

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