我有两个问题:
-
我怎样才能访问QFileDialog
并使用 Qt Test 模块在“文件名”字段中写入文件的路径?
我这么问是因为我正在 Qt 中开发一些 GUI 测试,现在我需要打开一个文本文件。以下代码创建QFileDialog
并获取文件路径:
QString filePath = QFileDialog::getOpenFileName(
this,
"Open",
"",
tr("Text Files (*.txt)") );
-
如果我使用线程(QThread
)来加载此文本文件中的内容,我如何等待此线程在我的 GUI 测试中完成?
我知道我可以使用QTest::qSleep( milliseconds );
命令,但我认为在这种情况下这不是一个好的做法。
如果可能的话请给我举个例子。
-
不幸的是,无法使用 Qt Test 模块。您有多种选择:
-
添加绕过对话框的测试挂钩:您需要检测代码以使其可测试。你可以例如设置一个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 绑定操作的线程池,它可以是QThredPool::globalInstance()
如果您希望全局池成为 I/O 池。 CPU 和 I/O 绑定的线程池应该是分开的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)