1

我有两个问题:

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

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

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

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

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

4

1 回答 1

2
  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 绑定操作的线程池,QThredPool::globalInstance()如果您希望全局池成为 I/O 池,则可能是这样。CPU 和 I/O 绑定的线程池应该是分开的。

于 2016-08-09T20:51:18.070 回答