这里使用 Qt 模仿实现了 Win10 系统下的 Wifi 列表,主要用的是 QlistWidget + xml + cmd命令行 实现。

效果

下载地址

https://github.com/confidentFeng/QtAppProject

关键代码

// 下一步按钮
connect(m_pBtnNext, &QPushButton::clicked, [=]{
// 1. 创建wifi配置文件
QString strWifiName = m_pLabName->text();
XmlHelper::Get()->WriteXml(strWifiName, m_pEditPasswd->text());
// 2. 添加wifi配置文件
QString strReturn = AppCommon::Get().ExecuteCmd(QString("netsh wlan add profile filename=%1/%2.xml")\
.arg(QApplication::applicationDirPath()).arg(strWifiName));
if (strReturn.contains("已将配置文件"))
{
// 密码正确,但未连接成功,则设置为连接中状态
this->setState(Connecting);
// 延时1.5秒,以显示加载状态
AppCommon::Get().sleepEvent(1500); // 连接wifi
QString strConReturn = AppCommon::Get().ExecuteCmd(QString("netsh wlan connect name=%1").arg(strWifiName));
qDebug() << "reurn " << strConReturn;
if(strConReturn.contains("已成功完成连接请求")) {
// 连接成功,则设置为连接中状态
this->setState(Connected);
}
else {
// 密码错误,未连接成功,则设置为编辑状态
this->setState(Edit); m_pLabErrorTip->setText(tr("网络安全秘钥不正确。请再试一次。"));
m_pLabErrorTip->show(); // 错误提示
}
}
else if (strReturn.contains("配置文件格式错误"))
{
m_pLabErrorTip->setText(tr("网络安全秘钥不正确。请再试一次。"));
m_pLabErrorTip->show(); // 错误提示
} // 不管添加wifi配置文件是否成功,都删除相应配置文件
QString fileName = QApplication::applicationDirPath() + "/" + strWifiName + ".xml";
QFile fileTemp(fileName);
fileTemp.remove();
}); // 写xml:WIFI的profile脚本文本
void XmlHelper::WriteXml(const QString& strWifiName, const QString& strWifiPasswd)
{
// 打开或创建文件
QFile file(QApplication::applicationDirPath() + "/" + strWifiName + ".xml"); // 相对路径、绝对路径、资源路径都可以
if(!file.open(QFile::WriteOnly | QFile::Truncate)) // 可以用QIODevice,Truncate表示清空原来的内容
return; QDomDocument doc;
// 写入xml头部
QDomProcessingInstruction instruction; // 添加处理命令
instruction = doc.createProcessingInstruction("xml", "version=\"1.0\"");
doc.appendChild(instruction);
// 添加根节点
QDomElement root = doc.createElement("WLANProfile");
root.setAttribute("xmlns", "http://www.microsoft.com/networking/WLAN/profile/v1");
doc.appendChild(root); // 添加子元素-name
QDomElement name = doc.createElement("name"); // 创建子元素
QDomText text;
text = doc.createTextNode(strWifiName);
name.appendChild(text); //添加子元素值
root.appendChild(name); // 添加子元素 // 添加子元素-SSIDConfig
QDomElement SSIDConfig = doc.createElement("SSIDConfig");
QDomElement SSID = doc.createElement("SSID");
QDomElement SSID_hex = doc.createElement("hex");
QDomElement SSID_name = doc.createElement("name");
//SSID_hex.appendChild(doc.createTextNode("4445565F322E3447")); // DEV_24.G 8个
//SSID_hex.appendChild(doc.createTextNode("52454D4F54452D352E3047")); // REMOTE-5.0G 11个
SSID_hex.appendChild(doc.createTextNode(QString(strWifiName.toLatin1().toHex())));
SSID_name.appendChild(doc.createTextNode(strWifiName));
SSID.appendChild(SSID_hex);
SSID.appendChild(SSID_name);
SSIDConfig.appendChild(SSID);
root.appendChild(SSIDConfig); // 添加子元素-connectionType
QDomElement connectionType = doc.createElement("connectionType");
connectionType.appendChild(doc.createTextNode("ESS"));
root.appendChild(connectionType); // 添加子元素-connectionMode
QDomElement connectionMode = doc.createElement("connectionMode");
connectionMode.appendChild(doc.createTextNode("auto"));
root.appendChild(connectionMode); // 添加子元素-MSM
QDomElement MSM = doc.createElement("MSM");
QDomElement security = doc.createElement("security");
// security添加子元素-authEncryption
QDomElement authEncryption = doc.createElement("authEncryption");
QDomElement authentication = doc.createElement("authentication");
QDomElement encryption = doc.createElement("encryption");
QDomElement useOneX = doc.createElement("useOneX");
authentication.appendChild(doc.createTextNode("WPA2PSK"));
//authentication.appendChild(doc.createTextNode("WPAPSK"));
encryption.appendChild(doc.createTextNode("AES"));
useOneX.appendChild(doc.createTextNode("false"));
authEncryption.appendChild(authentication);
authEncryption.appendChild(encryption);
authEncryption.appendChild(useOneX);
security.appendChild(authEncryption); // security添加子元素-sharedKey
QDomElement sharedKey = doc.createElement("sharedKey");
QDomElement keyType = doc.createElement("keyType");
QDomElement protectedP = doc.createElement("protected");
QDomElement keyMaterial = doc.createElement("keyMaterial");
keyType.appendChild(doc.createTextNode("passPhrase"));
protectedP.appendChild(doc.createTextNode("false"));
keyMaterial.appendChild(doc.createTextNode(strWifiPasswd));
sharedKey.appendChild(keyType);
sharedKey.appendChild(protectedP);
sharedKey.appendChild(keyMaterial);
security.appendChild(sharedKey);
// MSM添加子元素-security
MSM.appendChild(security);
root.appendChild(MSM); // 添加子元素-MSM
QDomElement MacRandomization = doc.createElement("MacRandomization");
MacRandomization.setAttribute("xmlns", "http://www.microsoft.com/networking/WLAN/profile/v3");
QDomElement enableRandomization = doc.createElement("enableRandomization");
enableRandomization.appendChild(doc.createTextNode("false"));
MacRandomization.appendChild(enableRandomization);
root.appendChild(MacRandomization); // 输出到文件
QTextStream out_stream(&file);
doc.save(out_stream,4); // 缩进4格
file.close();
}

【Qt 应用】模仿实现Win10的Wifi列表的更多相关文章

  1. android 获取wifi列表,如果你忽略了这个细节,可能你的软件会崩溃

    一:业务描述 最近公司有一个小需求,用户点击wifi扫描按钮(注意:是用户主动点击wifi扫描按钮),app去扫描附近的wifi,显示在listView中,仅此而已,app都不用去连接某个wifi,看 ...

  2. Qt 之 模仿 QQ登陆界面——样式篇

    一.简述 今天晚上花了半天时间从QQ登录界面抠了些图,顺便加了点样式基本上实现了QQ的登陆界面全部效果.虽不说100%相似,那也有99.99%相似了哈O(∩_∩)O. QQ好像从去年开始,登录界面有了 ...

  3. android开发-获取wifi列表

    近期博主在学frangment框架,因此想着想着就想通过listfragment完毕对wifi列表的获取. 好! 如今就不说废话了. 一.wifi的基础知识 在Android的官方文档中定义了例如以下 ...

  4. Qt实现表格控件-支持多级列表头、多级行表头、单元格合并、字体设置等

    目录 一.概述 二.效果展示 三.定制表头 1.重写数据源 2.重写QHeaderView 四.设置属性 五.相关文章 原文链接:Qt实现表格控件-支持多级列表头.多级行表头.单元格合并.字体设置等 ...

  5. Win10连WiFi显示无internet,安全 却可以正常上网

    1.现象: win10连WiFi显示无internet,安全 可以正常上网 2.原因: Wind10升级系统补丁后,更新了系统检查是否联网的注册表配置,新的域名在国内存在无法连接情况.导致此问题发生 ...

  6. win10 系统 wifi自动断开连接 wifi热点不稳定

    我的系统的电脑是win10系统,笔记本 下载了一个wifi共享大师,但是wifi总是自动断,于是就找了找问题所在 在网上看了许多方案,大多数都是    在   电源管理  把[允许计算机关闭此设备以节 ...

  7. 关于 win10 创建WiFi热点 问题(无法启动承载网络 , 我们无法设置移动热点,因为你的电脑未建立以太网,wifi或手机网络数据连接 )

    电脑创建WiFi,一般三种办法: 1. WiFi共享软件:猎豹wifi.wifi共享精灵.wifi共享大师..... 2. 命令提示符 netsh wlan set hostednetwork mod ...

  8. IOS零碎技术整理(3)-获取wifi列表

    1.   该功能实现基于MobileApple80211框架来进行开发,而目前该框架成为了私有框架,其中的API均为私有API. 如果使用这些API可能导致应用不能上app store或者ios版本升 ...

  9. win10 uwp 通知列表

    经常看到小伙伴问,问已经绑定列表,在进行修改时,不会通知界面添加或删除.这时问题就在,一般使用的列表不会在添加时通知界面,因为他们没有通知. 本文:知道什么是通知的列表,如何去写一个通知列表 在 C# ...

  10. 如何在win10查看wifi密码

    tep1 找到wifi图标 step 2 右键点击打开网络共享中心 没有啦!!

随机推荐

  1. Rust中的Copy和Clone

    1.Copy和Clone Rust中的Copy和Clonetrait都允许创建类型实例的副本.它们都提供了一种复制类型实例的方法,但它们之间存在一些重要的区别.了解这些区别有助更好地使用这两个特征. ...

  2. 22-source-map

    const { resolve } = require('path') const htmlWebpackPlugins = require('html-webpack-plugin') module ...

  3. vulnhub靶场之ADROIT: 1.0.1

    准备: 攻击机:虚拟机kali.本机win10. 靶机:Adroit: 1.0.1,下载地址:https://download.vulnhub.com/adroit/Adroit-v1.0.1.ova ...

  4. Mybatis 坑(1)

    org.apache.ibatis.executor.ExecutorException: No constructor found in xxxx [Integer,String] 这种情况一般是类 ...

  5. 突破传统监测模式:业务状态监控HM的新思路

    作者:京东保险 管顺利 一.传统监控系统的盲区,如何打造业务状态监控. 在系统架构设计中非常重要的一环是要做数据监控和数据最终一致性,关于一致性的补偿,已经由算法部的大佬总结过就不在赘述.这里主要讲如 ...

  6. day06-优惠券秒杀02

    功能03-优惠券秒杀02 4.功能03-优惠券秒杀 4.4一人一单 4.4.1需求分析 要求:修改秒杀业务,要求同一个优惠券,一个用户只能下一单. 在之前的做法中,加入一个对用户id和优惠券id的判断 ...

  7. Django笔记三十六之单元测试汇总介绍

    本文首发于公众号:Hunter后端 原文链接:Django笔记三十六之单元测试汇总介绍 Django 的单元测试使用了 Python 的标准库:unittest. 在我们创建的每一个 applicat ...

  8. PM系统成本科目挂接教程-如何查手册和看帮助文档

    如果这么简单的问题都无法入门只能说回炉重造吧孩子. ---by SheZQ 正文 成本科目挂接作为PM系统最基本的取数依据,数据汇总的根本,是必须要会的技能.如果没有挂接,就会出现空值或者0值. 摘自 ...

  9. 2022-11-27:超过经理收入的员工。编写一个SQL查询来查找收入比经理高的员工。以下数据的结果输出是Joe,因为Joe是唯一挣得比经理多的雇员。 DROP TABLE IF EXISTS `em

    2022-11-27:超过经理收入的员工.编写一个SQL查询来查找收入比经理高的员工.以下数据的结果输出是Joe,因为Joe是唯一挣得比经理多的雇员. DROP TABLE IF EXISTS `em ...

  10. 2022-06-28:以下golang代码输出什么?A:true;B:false;C:panic;D:编译失败。 package main import “fmt“ func main() {

    2022-06-28:以下golang代码输出什么?A:true:B:false:C:panic:D:编译失败. package main import "fmt" func ma ...