我有 2 个问题:
如何使用 Qt Test 模块访问
QFileDialog
并在“文件名”字段中写入文件的路径?我这么问是因为我正在 Qt 中开发一些 GUI 测试,现在我需要打开一个文本文件。以下代码创建
QFileDialog
并获取文件路径:QString filePath = QFileDialog::getOpenFileName( this, "Open", "", tr("Text Files (*.txt)") );
如果我使用线程 (
QThread
) 加载此文本文件中的内容,我如何等待此线程在 GUI 测试中完成?我知道我可以使用
QTest::qSleep( milliseconds );
命令,但我认为在这种情况下这不是一个好的做法。
如果可能的话,请给我举个例子。
最佳答案
不幸的是,无法使用 Qt Test 模块。您有多种选择:
添加绕过该对话框的测试 Hook :您需要检测代码以使其可测试。你可以例如在请求文件路径的对象上设置一个
testFile
属性,如果设置了该属性,则对象可以跳过请求文件。const char k_testFile[] = "k_testFile"; MyClass::foo() { ... auto testFile = property(k_testFile); auto filePath = testFile.isNull() ? QFileDialog::getOpenFilePath(...) : testFile.toString(); ... }
使用非 native 对话框,然后它是一个可以使用 Qt Test 进行测试的普通小部件。
使用特定于平台的方法来查找 native 对话框并与其交互。您需要为要测试的每个平台实现它。
文件加载后您应该发出一个信号。测试可以等待该信号。您甚至不需要使用显式线程来加载文件,异步加载文件的惯用方法是:
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/