c++通过wpa_cli命令获取扫描到的wifi,把扫描到的wifi列表传递给QML进行显示
c++部分代码:
QProcess process;
int validSsidCount = 0;
process.start("wpa_cli", QStringList() << "scan");
process.waitForFinished();
QThread::sleep(3);
process.start("wpa_cli", QStringList() << "scan_results");
process.waitForFinished();
QString output = process.readAllStandardOutput();
QStringList lines = output.split("\n", Qt::SkipEmptyParts);
qDebug() << "扫描到的 Wi-Fi 网络:";
for (const QString &line : lines) {
QStringList fields = line.split(QRegularExpression("\\s+"));
if (fields.size() > 4) {
QString ssid = fields[4];
// 检查SSID是否为空、长度是否大于20或是否等于"signal"
if (ssid.isEmpty() || ssid.length() > 20 || ssid == "signal") {
continue; // 如果不满足条件,跳过此循环
}
m_ssidList.append(ssid);
qDebug() << "WIFI: " << ssid; // 打印有效的 SSID
validSsidCount++; // 计数有效的 SSID
}
}
emit ssidListChanged(m_ssidList);
把获取到的wifi列表通过信号传递出去,QML里再接收这个信号
QML代码:
main.qml:
ListModel {
id:wlanmodel
}
Connections {
target: providers
onSsidListChanged: {
wlanmodel.clear(); // 清空现有模型
var wlist = providers.refreshSsidList()
for (var i = 0; i < ssidList.length; i++) {
wlanmodel.append({"name": ssidList[i]}); // 添加新的 SSID
console.log("name: ",ssidList[i]);
}
}
}
需要显示的地方:
ListView {
id: myListView
width: parent.width // 使 ListView 的宽度与 ColumnLayout 相同
height: 200 // 设定 ListView 的高度
model: wlanmodel
delegate: Item {
width: myListView.width
height: 40 // 每个列表项的高度
Text {
text: model.name
anchors.verticalCenter: parent.verticalCenter
}
}
}
target后面跟创建的c++的类对象,onSsidListChanged是监听ssidListChanged这个信号,要加on,信号第一个字母大写