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

标签 c++ qt qfiledialog qttest

我有 2 个问题:

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

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

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

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

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

最佳答案

  1. 不幸的是,无法使用 Qt Test 模块。您有多种选择:

    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/

相关文章:

python - 无法在 QFileDialog 中为文件添加扩展名

c++ - 我如何检查 std::pow 是否会溢出 double

c++ - 尝试将 "ExtraSamples"标记应用于要写入的 TIFF 文件时出错

c++ - main() 函数位于与我在 C++ 中的项目同名的 .cpp 文件中

c++ - Visual Studio C++ dll 库在 Qt 应用程序中崩溃

c++ - QFileSystemWatcher 不发送 fileChanged() 信号

linux - 可以使用 hcitool 而不是 gatttool 连接到 BLE 设备吗?

c++ - 如何检查 MS 编译器是否会编译我的源代码

python - 如何让 getOpenFileName 记住上次打开的路径?

qt - 如果在其槽中调用 QFileDialog,则 QPushButton 保持按下状态