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

时间:2018-12-21 12:48:51

标签: c++ qt

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

在测试中,我使用QTimer::singleShot等待QFileDialog出现在QT close window by QTest in locked thread中。

问题是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);
}

1 个答案:

答案 0 :(得分:1)

由于文件名文本框(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));
}

要使程序正常运行,有两种方法:

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