问题情况
因项目要求加载WiFi的设置界面到上位机上,方便用户操作。通过WiFi的ip在浏览器登录时会出现windows安全中心的密码登录框,输入用户名和密码即可进入WiFi的配置界面。
而qt是通过QWebEngineView加载网页,QWebEngineView的信息就不再重复,网上很多。我通过QWebEngineView的
load(QUrl("https://baidu.com"));
可以正常进去百度的界面。
可是我换成
load(QUrl("http://10.10.100.254/"));
windows弹不出输密码的界面,而直接报错,进不去WiFi的设置界面。
问题分析
因为之前没接触这块,经过查过大量的资料和网友的博客,最终确认这个windows安全中心弹出的密码界面属于http协议的基础认证,相当于访问网页服务器时,需要一个口令认证确认你是主人才能访问。这个口令就是用户名和密码组合,用base64转换的字符串。
转换在qt上说,先要给这个网页做基础认证,才能访问它。那怎么做认证呢,就要用到网络编程了。
上重点,代码来了。
mainwindow.c文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QAuthenticator>
#include <QNetworkReply>
#include <QTextCodec>
#include <QtNetwork>
#include <QStackedLayout>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
viewWeb = new QWebEngineView(this);
manager = new QNetworkAccessManager(this);
request = new QNetworkRequest();
QStackedLayout* layout = new QStackedLayout(ui->widget);
ui->widget->setLayout(layout);//嵌入在界面上
layout->addWidget(viewWeb);
request->setUrl(QUrl("http://10.10.100.254/"));
request->setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
request->setRawHeader("Authorization", "Basic YWRtaW46YWRtaW4=");//基础认证
qDebug()<<manager->networkAccessible();
manager->setNetworkAccessible(QNetworkAccessManager::Accessible);//如果已经认证,设置没认证状态
reply = manager->get(*request);
connect(reply, &QIODevice::readyRead, this, &MainWindow::finished);
connect(reply, QOverload<QNetworkReply::NetworkError>::of(&QNetworkReply::error),[=]{
});
connect(reply, &QNetworkReply::sslErrors, [=]{
});
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::finished()
{
QTextCodec *codec = QTextCodec::codecForName("gb2312"); //具体看网页的编码格式
QString all = codec->toUnicode(reply->readAll());
reply->deleteLater();
viewWeb->load(reply->url());
viewWeb->show();
}
mainwindow.h文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QWebEngineView>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow* ui;
QWebEngineView* viewWeb;
QNetworkRequest* request;
QNetworkReply* reply;
QNetworkAccessManager* manager;
private slots:
void finished();
};
#endif // MAINWINDOW_H
本工程所用的环境是 :vs2017 + qt5.14.1。
工程链接:https://download.csdn.net/download/weixin_43850620/14890452