如何控制QFileDialog使用Qt测试

How to control a QFileDialog using Qt Test?

本文关键字:QFileDialog 使用 Qt 测试 控制 何控制      更新时间:2023-10-16

我有两个问题:

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

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

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

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

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

  1. 不幸的是,这是不可能使用Qt测试模块。您有几个选择:

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

      const char k_testFile[] = "k_testFile";
      MyClass::foo() {
        ...
        auto testFile = property(k_testFile);
        auto filePath = testFile.isNull()
          ? QFileDialog::getOpenFilePath(...)
          : testFile.toString();
        ...
      }
      
    2. 使用一个非本地对话框,然后它是一个正常的小部件,你可以使用Qt测试。

    3. 使用特定于平台的方法来查找本机对话框并与之交互。

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

    QString filePath = ...;
    QtConcurrent::run(ioPool, [this, filePath]{
      auto data = MyLoader::load(filePath);
      emit haveFileData(data);
    });
    
    调用这段代码的类应该有一个haveFileData信号,其他代码可以连接到这个信号并按预期进行。ioPool是用于I/O绑定操作的线程池,如果您希望全局池作为I/O池,它可以是QThredPool::globalInstance()。CPU绑定线程池和I/o绑定线程池应该分开。