qt解决加载WiFi设置界面时需要得密码认证问题

问题情况

因项目要求加载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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值