从QWebEngine QT 5.13.0中的javascript dilog获取下载文件名

时间:2019-06-18 10:20:14

标签: javascript qt qt5 qwebengineview


我使用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 个答案:

答案 0 :(得分:1)

使用静态QWebEnginePageQInputDialog::getText中实现了Javascript提示窗口。如果要自定义此对话框或对文本进行任何操作,然后将其返回给JS,则需要子类QWebEnginePage并重写QWebEnginePage::javaScriptPrompt函数。

这是一个简单的示例:

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