这里使用 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. CVE-2022-21454:漏洞整改mysql5.7.37升级至5.7.38 tar包升级

    问题描述:对数据库服务器进行漏扫,发现一些中高位漏洞需要整改,有些数据库需要升级到最新版 漏洞修改指导链接:https://www.oracle.com/security-alerts/cpuapr2 ...

  2. 【MyBatis】分页插件

    分页插件 分页插件配置 a 添加依赖 <dependency> <groupId>com.github.pagehelper</groupId> <artif ...

  3. PHPCMSV9 单文件上传功能代码

    后台有"多文件上传"功能,但是对于有些情况,我们只需要上传一个文件,而使用多文件上传功能上传一个文件,而调用时调用一个文件太麻烦了. 所以我就自己动手,参考其他字段类型的网站,研究 ...

  4. vs 解决方案定位当前打开的cs文件

    可以通过工具-选项-项目和解决方案-勾选[在解决方案资源管理器中跟踪活动项]

  5. 【必知必会的MySQL知识】③DML语言

    目录 前言 准备 插入数据 语法格式 插入完整行数据 插入多行数据 将检索出来的数据插入表 更新数据 准备两张表 语法 实践操作 删除数据 语法 实践操作 小结 前言 前面的两篇文章中,我们已经对My ...

  6. selenium测试用例的编写,隐式等待与显式等待的编写

    开头 用配置好的 selenium 进行一个简单的测试用例的编写,可以参考allure的美化这一遍博文 https://www.cnblogs.com/c-keke/p/14837766.html 代 ...

  7. 2022-10-09:我们给出了一个(轴对齐的)二维矩形列表 rectangles 。 对于 rectangle[i] = [x1, y1, x2, y2],其中(x1,y1)是矩形 i 左下角的坐

    2022-10-09:我们给出了一个(轴对齐的)二维矩形列表 rectangles . 对于 rectangle[i] = [x1, y1, x2, y2],其中(x1,y1)是矩形 i 左下角的坐标 ...

  8. 2021-12-25:给定一个只由0和1组成的字符串S,假设下标从1开始,规定i位置的字符价值V[i]计算方式如下

    2021-12-25:给定一个只由0和1组成的字符串S,假设下标从1开始,规定i位置的字符价值V[i]计算方式如下 : 1 i == 1时,V[i] = 1: 2 i > 1时,如果S[i] ! ...

  9. pages.json 文件:pages 节点

    pages uni-app 通过 pages 节点配置应用由哪些页面组成,pages 节点接收一个数组,数组每个项都是一个对象,其属性值如下: 属性 类型 默认值 描述 path String   配 ...

  10. vscode运行java输出至指定文件夹

    一.前言 最近呢,需要用vscode编写一点小的java程序,也就是单java文件,但是呢,我发现coderunner运行java,一个java文件编译出一个class文件,这也太乱了!不符合我简约的 ...