Почему QFileDialog :: selectFile не работает? - PullRequest
0 голосов
/ 21 декабря 2018

Я использую Qt 5.12 и пытаюсь написать тест (используя QTest) для открытия проекта, хранящегося в каком-то формате xml.

В тесте я использую QTimer::singleShot, чтобы дождаться появления QFileDialog, как предложено в QT закрывает окно с помощью QTest в заблокированном потоке .

Проблема в том, что QFileDialog::selectFile ничего не выбирает. Это означает, что кнопка OK не активна, поэтомуЯ не могу щелкнуть по нему в моем тесте.

В следующем примере я предполагаю, что полный путь к файлу /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);
}

1 Ответ

0 голосов
/ 21 декабря 2018

Функция 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");
        }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...