C++ 如何使用Qt测试控制QFileDialog?

C++ 如何使用Qt测试控制QFileDialog?,c++,qt,qfiledialog,qttest,C++,Qt,Qfiledialog,Qttest,我有两个问题: 如何使用Qt测试模块访问QFileDialog并在“文件名”字段中写入文件路径 我这样问是因为我正在Qt中开发一些GUI测试,现在我需要打开一个文本文件。以下代码创建QFileDialog并获取文件路径: QString filePath = QFileDialog::getOpenFileName( this, "Open",

我有两个问题:

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

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

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

    我知道我可以使用
    QTest::qSleep(毫秒)命令,但我认为在这种情况下这不是一个好的实践

  • 如果可能,请给我举个例子

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

  • 添加绕过该对话框的测试挂钩:您需要插入代码以使其可测试。例如,您可以在请求文件的对象上将
    testFile
    属性设置为文件路径,如果设置了该属性,则对象可以跳过请求文件

    const char k_testFile[] = "k_testFile";
    
    MyClass::foo() {
      ...
      auto testFile = property(k_testFile);
      auto filePath = testFile.isNull()
        ? QFileDialog::getOpenFilePath(...)
        : testFile.toString();
      ...
    }
    
  • 使用一个非本机对话框,然后它是一个普通的小部件,您可以使用Qt-test进行测试

  • 使用特定于平台的方法查找本机对话框并与之交互。您需要在每个要测试的平台上实现它

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

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


  • 你是说Qt测试模块,对吗?是的,Qt测试模块。谢谢,库巴。1.我不知道什么是“测试挂钩”,但我会搜索它。2.这不是我的项目当前的选项。:/3.我不太明白这个选择。我正在使用Windows平台进行开发,但是应用程序是多平台的,因此,我认为这对我来说不是一个有效的选择。您需要添加测试挂钩,以便在您测试的每个平台上操作平台对话框。在Windows和OS X上会相对容易。在Linux上会更难,“本机”对话框可能是Qt对话框、KDE对话框或Gnome对话框。实际上,我只需要在Windows和OS X上使用它,那么,也许这个选项是一个可能的解决方案。