如何控制QFileDialog使用Qt测试
How to control a QFileDialog using Qt Test?
我有两个问题:
-
我如何访问
QFileDialog
并使用Qt测试模块在"文件名"字段中写入文件的路径?我问,因为我在Qt开发一些GUI测试,现在我需要打开一个文本文件。下面的代码创建
QFileDialog
并获取文件路径:QString filePath = QFileDialog::getOpenFileName( this, "Open", "", tr("Text Files (*.txt)") );
-
如果我使用一个线程(
QThread
)来加载这个文本文件中的内容,我怎么能等待这个线程在我的GUI测试中完成?我知道我可以使用
QTest::qSleep( milliseconds );
命令,但我不认为这是一个很好的做法,在这种情况下
如果可能的话,请给我举个例子。
-
不幸的是,这是不可能使用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绑定线程池应该分开。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- C++:TypeDef使用元组
- 使用std::multimap迭代器创建std::list
- 从不同线程使用int64的不同字节安全吗
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么在全局范围内使用"extern int a"似乎不行?
- 我可以强制 QFileDialog 使用系统区域设置而不是系统语言吗?
- 如何使用qfiledialog和提升来保存多个图像
- 无法使用qfiledialog(QT 5.7)打开文件
- QFileDialog:使用 getOpenFileName 允许不存在的文件
- 全局声明QStringlist变量,使用QFileDialog获取位置路径并将其打印到lineEdit并在QProces
- 使用opencv打开映像,使用QFileDialog::getOpenFileName打开Qt
- 如何使用QFileDialog打开"我的电脑"
- 需要使用 QFileDialog 保存一个新文件
- 有没有一种方法可以在Linux上使用QFileDialog自动为文件添加扩展名
- 如何使用QFileDialog打开虚拟文件夹
- Qt -如何复制文件与QFile::复制使用QFileDialog
- 如何控制QFileDialog使用Qt测试
- 使用QFileDialog自动保存文件
- 如何使用QFileDialog允许只打开某些后缀