- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 Qt 5.5.1,我使用 QWebview 创建了一个小型浏览器,当
我打开一个网页并按下一个按钮时,它会获取网站的内容,就像我在 QnetworkAccessManager 中使用 get 方法一样不使用它,因为我想从具有登录页面的网站获取数据,因此当我登录时 URL 不会更改并且没有向 PHP 发布方法来获取数据。
例如,当我登录 www.login.com 时,登录数据显示在同一个链接上
我需要知道我可以解决这个问题,或者我是否可以从 QWebview 中打开的网站获取当前数据
注意
当我登录网站并通过在 firefox 中点击查看源代码来获取数据时,登录数据出现在源代码中
这是我试过的
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow) {
ui->setupUi(this);
ui->webView->load(QUrl("https://www.login.com")); // load page that have user name and password field
QWebPage *page = ui->webView->page(); // get the current page
manager = page->networkAccessManager(); // get the access manager from this page
}
MainWindow::~MainWindow() {
delete ui;
}
// get button
void MainWindow::on_pushButton_clicked() {
reply = manager->get(QNetworkRequest(QUrl("https://www.login.com"))); // make get now after login
connect(reply, SIGNAL(readyRead()),this,SLOT(readyRead()));
connect(reply, SIGNAL(finished()),this, SLOT(finish()));
}
void MainWindow::readyRead() {
QString str = QString::fromUtf8(reply->readAll()).trimmed(); // read the data
ui->plainTextEdit->appendPlainText(str);
}
但是我没有登录就得到了第一页的数据。我想在登录后获取页面内容,请给我任何关于我应该做什么的提示。
更新
我从 firefox 查看页面源代码获取文本输入名称并使用 QUrlQuery 发布到它结果是第一页没有登录这部分 HTML 代码我得到了它的名称
<label class="label-off" for="dwfrm_ordersignup_orderNo">Numéro de la commande</label> <input class="textinput required" id="anyname" type="text" name="UserName" value="" maxlength="2147483647" placeholder="* UserName" data-missing-error="Saisis ton numéro de commande. " data-parse-error="Ce contenu est invalide" data-range-error="Ce contenu est trop long ou trop court" required="required" />
并且它在其他字段上有相同的代码。
我在Qt中发帖的代码
manager = new QNetworkAccessManager(this);
QUrlQuery query;
query.addQueryItem("UserName", "AAAA");
query.addQueryItem("Password", "BBB");
reply = manager->post(QNetworkRequest(QUrl(ui->lineEdit->text().trimmed())), query.toString().toUtf8());
connect(reply,&QNetworkReply::downloadProgress,this,&MainWindow::progress);
connect(reply,SIGNAL(readyRead()),this,SLOT(readyRead()));
connect(reply, SIGNAL(finished()), this,SLOT(finish()));
我尝试使用我制作的 PHP 页面的邮政编码,它解决了这里的问题,它只是 HTML 页面
最佳答案
我将使用不同的方法,而不是模拟 POST 请求,我将使用 QWebView
正常加载登录页面并使用 Qt 填充用户名、密码并在提交上做一个假点击按钮。
关于如何保存登录后页面的内容,而不是 HTML 代码,Qt 提供的一个好方法是将 Web View 呈现为 PDF,缺点是会丢失 HTML 代码。
如果只有代码足够你可以使用webview->page()->mainFrame()->toHtml()
看一个简单的例子,请注意你需要将代码适配你的环境,分析登录页面等。
void MainWindow::start()
{
connect(webview, &QWebView::loadFinished, this, &MainWindow::LogIn);
QString html = "<html>"
"<body>"
"<form action=\"https://httpbin.org/post\" method=\"POST\">"
"Username:<br>"
"<input type=\"text\" name=\"usernameinput\" value=\"abc\">"
"<br>"
"Password:<br>"
"<input type=\"password\" name=\"passwordinput\" value=\"123\">"
"<br><br>"
"<button name=\"button1\">Submit</button>"
"</form>"
"</body>"
"</html>";
webview->setHtml(html); //Load yours https://www.login.com, using setHtml just for example
}
void MainWindow::LogIn(bool ok)
{
disconnect(webview, &QWebView::loadFinished, this, &MainWindow::LogIn); //Disconnect the SIGNAL
if (!ok)
return;
QWebElement document = webview->page()->mainFrame()->documentElement();
QWebElement username = document.findFirst("input[name=usernameinput]"); //Find the first input with name=usernameinput
if (username.isNull())
return;
username.setAttribute("value", "def"); //Change the value of the usernameinput input even
//if it already has some value
QWebElement password = document.findFirst("input[name=passwordinput]"); //Do the same for password
if (password.isNull())
return;
password.setAttribute("value", "123456"); //Do the same for password
QWebElement button = document.findFirst("button[name=button1]"); //Find the button with name "button1"
if (button.isNull())
return;
connect(webview, &QWebView::loadFinished, this, &MainWindow::finished);
button.evaluateJavaScript("this.click()"); //Do a fake click on the submit button
}
void MainWindow::finished(bool ok)
{
disconnect(webview, &QWebView::loadFinished, this, &MainWindow::finished);
if (!ok)
return;
QByteArray data;
QBuffer buffer(&data);
if (!buffer.open(QIODevice::WriteOnly))
return;
QPdfWriter pdfwriter(&buffer);
pdfwriter.setResolution(100); //In DPI
webview->page()->setViewportSize(QSize(pdfwriter.width(), pdfwriter.height()));
QPainter painter;
painter.begin(&pdfwriter);
webview->page()->mainFrame()->render(&painter);
painter.end();
buffer.close();
qDebug() << "PDF Size:" << data.size(); //Now you have a PDF in memory stored on "data"
}
关于html - 使用 Qt 5.5.1 从 QWebView 获取网站内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42202269/
我正在尝试使用 Qt4 在 VLC 的单独对话框中添加浏览器控件。我设法在打开对话框的菜单栏中添加了一个菜单项。 以下是我的代码: class DialogBrowser : public QDial
这些定义有什么区别? #include "QWebView" 类 QWebView; 最佳答案 class QWebView;是所谓的前向声明。这意味着,在完全声明类型之前,您无法访问类的详细信息(如
我尝试运行它,但没有任何反应。 void MainWindow::on_pushButton_2_clicked() { ui->webView->load(QUrl("javascript:
我正在编写一个显示文件夹中静态 HTML 文件的应用程序。出于某种原因,PyQt4 的 QWebView class 不允许渲染任何字体,即使对于远程网站: QWebView : Chrome : 我
如何防止 QWebView 加载图像(出于节省流量的原因)? 最佳答案 可以在 QWebView 的设置中禁用它: web_view = QWebView() web_view.settings().
右键单击使用 QWebView 查看的网页上的任何文本在 Windows 上选择光标下的单词。我想禁用此行为,但在文档中找不到任何引用。 最佳答案 这个偏好看起来很深入网络套件 (为 QWebView
我的应用程序包含一个继承 QWebView 的类。问题是每次我尝试在此 View 中输入内容时都会崩溃!这是我的代码: void QViewSupport::setupSupport(QWidget
我想处理失败的请求(例如,回复http 404错误代码),在QWebView中显示我自己的“notfound.html”页面。但是没有简单的方法来处理 QWebView/QWebPage 类的回复。
我正在尝试编写一个可以播放 Flash 列表的程序(例如,来自 YouTube 的)我正在使用 QWebview 来显示视频,该插件工作正常。 但是,我如何知道一个视频何时结束,以便我可以开始下一个?
我使用 QWebView.load(QUrl(myurl)) 打开一个网页,该网页获取一些输入并返回一个新的 php 生成的页面。 如果在 Firefox 中执行,浏览器会自动打开一个新选项卡/窗口来
我正在使用 Qt5.4.3,在某些时候,Qt 会打印出这样的消息 LEAK: 145 CachedResource LEAK: 4432 WebCoreNode 我尝试在 Qt 应用程序上显示网页,但
我正在使用 Qt 5.6,问题是 QWebView 没有出现在小部件框中。看起来小部件没有安装,但我还没有找到任何安装方法。 最佳答案 在 Qt 5.6 中你需要使用 QWebEngineView 然
即使我为 QWebView 设置了几何形状,它也会占据整个屏幕的左侧。 更糟糕的是,如果我最大化窗口,两个小部件之间会有间隙 下面是我写的代码: from PyQt4.QtGui import * f
我的 Qt 应用程序在 QWebView 小部件中加载外部 html 页面。如何定义自己的样式表来呈现页面内容?是否可以捆绑一个 .css 文件供 QWebView 提取? 最佳答案 您可以使用QWe
代码 News::News(QWidget *parent) : QDialog(parent), ui(new Ui::News) { ui->setupUi(this);
由于 QWebView() 可能在 Ubuntu 16.10 及以上版本中不可用,因此执行以下操作的替代可能性是什么: View = QWebView() view.load(QUrl('http:/
我想让 QWebView 看起来扩展到宽度和高度,以便理想情况下它没有滚动条。有些网站可能有固定的宽度,不允许这样做,但我不关心这些。无论如何,我不能如愿以偿,因为 QWebView 实现 sizeH
我在 Windows 8.1 上运行基于 Qt 5.3.1 的 QtCreator 3.2.0。 似乎无论我尝试加载什么网站,onLoadFinished 插槽总是返回 false。我尝试使用和不使用
好吧,我正在尝试使用 CSS 分页符属性打印具有多个页面的 QWebView,该属性适用于 WebKit。我正在使用 Qt 5.1.1。 我的主要问题是,当我使用 Qt 将其打印为 PDF 时,一切都
bool MainWindow::waitForLoad(QWebView& view) { QEventLoop loopLoad; QTimer timer; QObjec
我是一名优秀的程序员,十分优秀!