从 WebEngine QT 5.13.0 中的 javascript 对话框获取下载文件名

Posted

技术标签:

【中文标题】从 WebEngine QT 5.13.0 中的 javascript 对话框获取下载文件名【英文标题】:Get Download file Name from a javascript dilog in QWebEngine QT 5.13.0 【发布时间】:2019-06-18 10:20:14 【问题描述】:

我使用 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 对话框中写入的文件名,这是一张图片它的样子 所以我需要一种方法来获取插槽中的文件名或其他任何东西,这样我就可以在按确定并开始下载之前使用它来取这个名称并命名文件。

谢谢。

【问题讨论】:

路径在C++端,要在JS端使用吗? 这个 javascript 提示显示在我的 QWebEngineView 中,我只希望它里面的值在 QString 中得到它,这样我就可以使用它并命名下载的文件,这个对话框由 QWebEngineView 生成我只是使用编写的javascript对话框,我不知道它到底是什么。 【参考方案1】:

Javascript 提示窗口在QWebEnginePage 中使用静态QInputDialog::getText 实现。如果您想自定义此对话框或在文本返回给 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"));

【讨论】:

以上是关于从 WebEngine QT 5.13.0 中的 javascript 对话框获取下载文件名的主要内容,如果未能解决你的问题,请参考以下文章

Yocto SDK,QtWebEngine:QT 中的未知模块:webengine

如何单击 Qt WebEngine 中的按钮?

是否可以将 Qt WebEngine 中的代理 URL 列入白名单

如何使用 Qt webEngine 而不是 Qt webkit

Qt基础之十八:WebEngine与JavaScript交互

Qt基础之十八:WebEngine与JavaScript交互