我正在使用Qt 5.12并尝试编写测试(使用QTest)以打开以xml格式存储的项目。
在测试中,我使用QTimer::singleShot
等待QFileDialog
出现在QT close window by QTest in locked thread中。
问题在于QFileDialog::selectFile
没有选择任何内容。 这意味着“确定”按钮未激活,因此我无法在测试中单击它。
我在以下示例中假定文件的完整路径为/tmp/project.xml
。请注意QFileDialog::setDirectory
很好用:当以下示例开始时,您位于/tmp
dir中,而不是/
中。
#include <QApplication>
#include <QFileDialog>
#include <QTimer>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTimer::singleShot(300, []() {
QWidget* window = nullptr;
while (!window) {
window = qApp->activeModalWidget();
}
QFileDialog* fd = qobject_cast<QFileDialog*>(window);
fd->setDirectory("/tmp");
fd->selectFile("project.xml");
});
QString path = QFileDialog::getOpenFileName(nullptr, "Open Project",
"/", QString(),
nullptr, QFileDialog::DontUseNativeDialog);
}
最佳答案
由于文件名文本框(lineEdit)处于焦点状态,因此selectFile函数不起作用。此行为来自QFileDialog::selectFile()的实现:
void QFileDialog::selectFile(const QString &filename)
{
// ... function body
//Put the filename into the lineEdit when :
//1. The dialog is not visible or
//2. The lineEdit is not focused.
if (!isVisible() || !d->lineEdit()->hasFocus())
d->lineEdit()->setText(index.isValid() ? index.data().toString() : fileFromPath(d->rootPath(), filename));
}
要使程序正常运行,有两种方法:
fd->setDirectory("/tmp");
QLineEdit * lineEdit = qobject_cast<QLineEdit*>(fd->focusWidget());
if( lineEdit ){
//Method 1
lineEdit->setText("project.xml");
//Method 2
lineEdit->nextInFocusChain()->setFocus();
fd->selectFile("project.xml");
}else { //no lineEdit focus found
fd->selectFile("project.xml");
}