为什么 QFileDialog::selectFile 不起作用?

Why QFileDialog::selectFile doesn't work?

本文关键字:不起作用 selectFile 为什么 QFileDialog      更新时间:2023-10-16

我正在使用Qt 5.12,并试图编写测试(使用QTest)以打开以某种xml格式存储的项目。

在测试中,我使用QTimer::singleShot等待QFileDialog出现,如锁定线程中QTest在QT关闭窗口中建议的那样。

问题是QFileDialog::selectFile没有选择任何内容这意味着"确定"按钮未激活,因此我无法在测试中单击它。

在下面的示例中,我假设文件的完整路径是/tmp/project.xml。请注意,QFileDialog::setDirectory工作得很好:当下面的示例开始时,您所在的是/tmp目录,而不是/

#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);
}

函数selectFile不起作用,因为文件名文本框(lineEdit)是焦点。此行为来自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));
}

要使程序正常工作,有两种方法:

  1. 将文件名直接放在文本框中
  2. 将焦点移开,然后致电selectFile

    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");
    }