【Qt 应用】模仿实现Win10的Wifi列表
这里使用 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列表的更多相关文章
- android 获取wifi列表,如果你忽略了这个细节,可能你的软件会崩溃
一:业务描述 最近公司有一个小需求,用户点击wifi扫描按钮(注意:是用户主动点击wifi扫描按钮),app去扫描附近的wifi,显示在listView中,仅此而已,app都不用去连接某个wifi,看 ...
- Qt 之 模仿 QQ登陆界面——样式篇
一.简述 今天晚上花了半天时间从QQ登录界面抠了些图,顺便加了点样式基本上实现了QQ的登陆界面全部效果.虽不说100%相似,那也有99.99%相似了哈O(∩_∩)O. QQ好像从去年开始,登录界面有了 ...
- android开发-获取wifi列表
近期博主在学frangment框架,因此想着想着就想通过listfragment完毕对wifi列表的获取. 好! 如今就不说废话了. 一.wifi的基础知识 在Android的官方文档中定义了例如以下 ...
- Qt实现表格控件-支持多级列表头、多级行表头、单元格合并、字体设置等
目录 一.概述 二.效果展示 三.定制表头 1.重写数据源 2.重写QHeaderView 四.设置属性 五.相关文章 原文链接:Qt实现表格控件-支持多级列表头.多级行表头.单元格合并.字体设置等 ...
- Win10连WiFi显示无internet,安全 却可以正常上网
1.现象: win10连WiFi显示无internet,安全 可以正常上网 2.原因: Wind10升级系统补丁后,更新了系统检查是否联网的注册表配置,新的域名在国内存在无法连接情况.导致此问题发生 ...
- win10 系统 wifi自动断开连接 wifi热点不稳定
我的系统的电脑是win10系统,笔记本 下载了一个wifi共享大师,但是wifi总是自动断,于是就找了找问题所在 在网上看了许多方案,大多数都是 在 电源管理 把[允许计算机关闭此设备以节 ...
- 关于 win10 创建WiFi热点 问题(无法启动承载网络 , 我们无法设置移动热点,因为你的电脑未建立以太网,wifi或手机网络数据连接 )
电脑创建WiFi,一般三种办法: 1. WiFi共享软件:猎豹wifi.wifi共享精灵.wifi共享大师..... 2. 命令提示符 netsh wlan set hostednetwork mod ...
- IOS零碎技术整理(3)-获取wifi列表
1. 该功能实现基于MobileApple80211框架来进行开发,而目前该框架成为了私有框架,其中的API均为私有API. 如果使用这些API可能导致应用不能上app store或者ios版本升 ...
- win10 uwp 通知列表
经常看到小伙伴问,问已经绑定列表,在进行修改时,不会通知界面添加或删除.这时问题就在,一般使用的列表不会在添加时通知界面,因为他们没有通知. 本文:知道什么是通知的列表,如何去写一个通知列表 在 C# ...
- 如何在win10查看wifi密码
tep1 找到wifi图标 step 2 右键点击打开网络共享中心 没有啦!!
随机推荐
- .NET中使用RabbitMQ总结
目前业界使用较多的消息队列组件有RabbitMQ.ActiveMQ.MSMQ.kafka.zeroMQ等 之间的对比可以看这里 之前搭过ActiveMQ环境带源码 点击这里 后来发现RabbitMQ性 ...
- LeeCode链表问题(一)
本文中所使用的链表定义如下所示: # Definition for singly-linked list. class ListNode: def __init__(self, val=0, next ...
- Redis使用之缓存清除
1. Redis到期缓存清除策略(三种) 定时删除:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除. 优点:定时删除策略对内存是友好的,通过 ...
- ABPvNext-微服务框架基础入门
ABPvNext-微服务框架基础入门 本文使用的是ABPvNext商业版 最新稳定版本7.0.2为演示基础的,后续如果更新,会单独写一篇最新版本的,此文为零基础入门教程,后续相关代码会同步更新到git ...
- LeetCode 双周赛 102,模拟 / BFS / Dijkstra / Floyd
本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,欢迎来到小彭的 LeetCode 周赛解题报告. 昨晚是 LeetCode 双周赛第 102 场,你 ...
- JSON.stringify()与JSON.parse()没有你想的那样简单
重新学习这两个API的起因 在本周五有线上的项目,16:30开始验证线上环境. 开始都是顺顺利利,一帆风顺. 大概17:50左右,我正在收拾东西. 准备下班去王者峡谷骑着我的船溜达一圈. 可是天降意外 ...
- Go语言核心知识回顾(接口、Context、协程)
温故而知新 接口 接口是一种共享边界,计算机系统的各个独立组件可以在这个共享边界上交换信息,在面向对象的编程语言,接口指的是相互独立的两个对象之间的交流方式,接口有如下好处: 隐藏细节: 对对象进行必 ...
- 面试最常问的数组转树,树转数组 c++ web框架paozhu实现
刚毕业同学,找工作常被问 二维数组转树,树转二维数组 需要支持无限层级实现,如果你了解这个语言那么实现起来还要一番思考 c++ web框架 paozhu使用 需要实现数据库表数据到前台菜单实现,就是这 ...
- 【python爬虫】对站长网址中免费简历模板进行爬取
本篇仅在于交流学习 解析页面 可以采用xpath进行页面连接提取 进入页面 通过进入的页面可以得到下载地址 步骤: 提取表页面模板链接-->进入连接-->提取页面内下载地址连接--> ...
- 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 + ...