Получить Загрузить имя файла из javascript dilog в QWebEngine QT 5.13.0 - PullRequest
0 голосов
/ 18 июня 2019


Я использую QWebEngine для просмотра веб-сайта, появляется всплывающее окно загрузки, и мне нужно загрузить его в папку, которую я установил, я использую этот код,
это, чтобы получить любой сигнал файла загрузки

ui->widget->load(QUrl(ui->lineEdit->text().trimmed()));
QWebEnginePage *page = ui->widget->page();
QWebEngineProfile *profile = page->profile();
connect(profile, SIGNAL(downloadRequested(QWebEngineDownloadItem*)), this, SLOT(DownloadItem(QWebEngineDownloadItem*)));

затем я делаю это, чтобы начать принимать и загружать файл в слот

void MainWindow::DownloadItem(QWebEngineDownloadItem *item)
{
    item->setPath("D:/amr.pdf");
    connect(item, SIGNAL(finished()), this, SLOT(DownloadFinish()));
    connect(item, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(downloadProgress(qint64,qint64)));
    item->accept();
    qDebug() << "URL to download = " << item->url().toString();
}

Хитрость здесь в том, что после того, как я загружаю файл, существует файл javascriptпоявляется и просит меня назвать файл, поэтому вопрос здесь, как я могу получить имя файла, записанное в этом диалоговом окне javascript, вот изображение того, как оно выглядит enter image description here, поэтому мне нужен способчтобы получить имя файла в слоте или что-то еще, чтобы я мог использовать его, чтобы взять это имя и дать имя файлу, прежде чем я нажму ok и загрузка начнется.

Спасибо.

1 Ответ

1 голос
/ 19 июня 2019

Окно подсказок Javascript реализовано в QWebEnginePage с использованием статического QInputDialog :: getText . Если вы хотите настроить это диалоговое окно или выполнить какие-либо манипуляции с текстом, прежде чем он будет возвращен обратно в JS, вам необходимо создать подкласс QWebEnginePage и переопределить QWebEnginePage :: javaScriptPrompt function.

Вот простой пример:

mywebpage.h

#ifndef MYWEBPAGE_H
#define MYWEBPAGE_H

#include <QObject>
#include <QWebEnginePage>
#include <QWebEngineProfile>

class MyWebPage : public QWebEnginePage
{
public:
    explicit MyWebPage(QWebEngineProfile *profile, QObject *parent = Q_NULLPTR):QWebEnginePage(profile, parent){}

protected:
    bool javaScriptPrompt(const QUrl &securityOrigin, const QString& msg, const QString& defaultValue, QString* result) override;

};

#endif // MYWEBPAGE_H

mywebpage.cpp

#include "mywebpage.h"
#include <QDebug>
#include <QInputDialog>

bool MyWebPage::javaScriptPrompt(const QUrl &securityOrigin, const QString& msg, const QString& defaultValue, QString* result)
{
    bool ok = false;
    QString save_me = QInputDialog::getText(this->view(), tr("MyJavaScript Prompt"), msg, QLineEdit::Normal, defaultValue, &ok);

    //do any manipulations with save_me
    qDebug() << "User entered this string: " << save_me;

    //... and copy it to result
    result->append(save_me);

    return ok;
}

А вот пример того, как вы можете установить свой подкласс WebPage для экземпляра WebView:

auto webview = new QWebEngineView(this);
webview->setPage(new MyWebPage(QWebEngineProfile::defaultProfile(), webview));

//you can test your Prompt here
webview->load(QUrl::fromUserInput("https://www.w3schools.com/Jsref/tryit.asp?filename=tryjsref_prompt"));
...