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