我使用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对话框中写的文件名,这是一个图像看起来如何 因此,我需要一种方法来获取插槽中的文件名或其他名称,以便在我按OK键并开始下载之前,可以使用该名称来命名文件并命名文件。
谢谢。
答案 0 :(得分:1)
使用静态QWebEnginePage在QInputDialog::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"));