如何使用Qt测试控制QFileDialog?

时间:2016-08-09 19:12:44

标签: c++ qt qfiledialog qttest

我有两个问题:

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

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

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

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

  3. 如果有可能,请告诉我一个例子。

1 个答案:

答案 0 :(得分:1)

  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绑定的线程池应该是分开的。