簡體   English   中英

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

[英]Why QFileDialog::selectFile doesn't work?

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM