这里使用 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. .NET中使用RabbitMQ总结

    目前业界使用较多的消息队列组件有RabbitMQ.ActiveMQ.MSMQ.kafka.zeroMQ等 之间的对比可以看这里 之前搭过ActiveMQ环境带源码 点击这里 后来发现RabbitMQ性 ...

  2. LeeCode链表问题(一)

    本文中所使用的链表定义如下所示: # Definition for singly-linked list. class ListNode: def __init__(self, val=0, next ...

  3. Redis使用之缓存清除

    1. Redis到期缓存清除策略(三种) 定时删除:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除. 优点:定时删除策略对内存是友好的,通过 ...

  4. ABPvNext-微服务框架基础入门

    ABPvNext-微服务框架基础入门 本文使用的是ABPvNext商业版 最新稳定版本7.0.2为演示基础的,后续如果更新,会单独写一篇最新版本的,此文为零基础入门教程,后续相关代码会同步更新到git ...

  5. LeetCode 双周赛 102,模拟 / BFS / Dijkstra / Floyd

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,欢迎来到小彭的 LeetCode 周赛解题报告. 昨晚是 LeetCode 双周赛第 102 场,你 ...

  6. JSON.stringify()与JSON.parse()没有你想的那样简单

    重新学习这两个API的起因 在本周五有线上的项目,16:30开始验证线上环境. 开始都是顺顺利利,一帆风顺. 大概17:50左右,我正在收拾东西. 准备下班去王者峡谷骑着我的船溜达一圈. 可是天降意外 ...

  7. Go语言核心知识回顾(接口、Context、协程)

    温故而知新 接口 接口是一种共享边界,计算机系统的各个独立组件可以在这个共享边界上交换信息,在面向对象的编程语言,接口指的是相互独立的两个对象之间的交流方式,接口有如下好处: 隐藏细节: 对对象进行必 ...

  8. 面试最常问的数组转树,树转数组 c++ web框架paozhu实现

    刚毕业同学,找工作常被问 二维数组转树,树转二维数组 需要支持无限层级实现,如果你了解这个语言那么实现起来还要一番思考 c++ web框架 paozhu使用 需要实现数据库表数据到前台菜单实现,就是这 ...

  9. 【python爬虫】对站长网址中免费简历模板进行爬取

    本篇仅在于交流学习 解析页面 可以采用xpath进行页面连接提取 进入页面 通过进入的页面可以得到下载地址 步骤: 提取表页面模板链接-->进入连接-->提取页面内下载地址连接--> ...

  10. 2022-07-13:给你一个整数数组 arr ,你一开始在数组的第一个元素处(下标为 0)。 每一步,你可以从下标 i 跳到下标 i + 1 、i - 1 或者 j : i + 1 需满足:i +

    2022-07-13:给你一个整数数组 arr ,你一开始在数组的第一个元素处(下标为 0). 每一步,你可以从下标 i 跳到下标 i + 1 .i - 1 或者 j : i + 1 需满足:i + ...