我正在使用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));
}

要使程序正常运行,有两种方法:
  • 将文件名直接放在文本框中
  • 释放焦点,然后调用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");
        }
    
  • 09-06 11:46