Qt 通过 QNetworkAccessManager 扫描 Wi-Fi
Posted
技术标签:
【中文标题】Qt 通过 QNetworkAccessManager 扫描 Wi-Fi【英文标题】:Qt Scanning Wi-Fi by QNetworkAccessManager 【发布时间】:2017-08-03 14:19:40 【问题描述】:欢迎 我在扫描 Wi-Fi 以获取所有可用的 Wi-Fi 连接时遇到问题。到目前为止我已经写了这段代码:
#include <QCoreApplication>
#include <QNetworkConfigurationManager>
#include <QNetworkConfiguration>
#include <QDebug>
#include <QNetworkSession>
int main(int argc, char *argv[])
QCoreApplication a(argc, argv);
QNetworkConfigurationManager ncm;
QNetworkConfiguration cfg;
QNetworkConfiguration::StateFlags flags;
int count = QNetworkConfiguration::Active;
qDebug() << "Amount available connect in Wi-Fi :" << count;
qDebug() << ncm.allConfigurations(flags = 0);
return a.exec();
我在显示 allConfigurations 时遇到问题。我已阅读文档 Qt Network Configuration Manager 但我不知道该怎么做。
【问题讨论】:
我想获取可以通过 wifi 连接的可用设备列表。我读过 allConfigurations 使之成为可能,但我无法使其工作。 functionallConfigurations
return QList<QNetworkConfiguration>
你不能调试它。
好的,我为您制作了一个简单的应用程序来做到这一点。
int count = QNetworkConfiguration::Active;
看起来不对。您没有获得活动设备的数量,而是存储了枚举的 int 值。并编辑您的问题,而不是通过发布 cmets 来完成它。
最好使用本机方法获取 wifi 网络 SSID,因为不能保证“QNetworkConfiguration”总是返回网络的 SSID。如果是 windows 使用 windows 库,如果是 android,则通过 java 使用 android wifi 服务,如果是在 ios 中,则使用objective c
【参考方案1】:
使用QNetworkAccessManager扫描 Wi-Fi。
我使用 QNetworkConfigurationManager 类来获取所有可用的 WiFi 并将它们全部显示到 QTreeWidget 中。
QNetworkConfigurationManager ncm; netcfgList = ncm.allConfigurations();
.pro 文件:
QT += core gui network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = WiFi
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
.cpp 文件:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
ui->setupUi(this);
findTimer = new QTimer();
findTimer->setInterval(1000);
connect(findTimer,&QTimer::timeout,this,&MainWindow::findActiveWirelesses);
findTimer->start();
foundCount = 0;
ui->treeWidgetWiFis->setColumnWidth(0,50);
ui->treeWidgetWiFis->setColumnWidth(1,200);
findActiveWirelesses();
MainWindow::~MainWindow()
delete ui;
void MainWindow::findActiveWirelesses()
QNetworkConfigurationManager ncm;
netcfgList = ncm.allConfigurations();
WiFisList.clear();
for (auto &x : netcfgList)
if (x.bearerType() == QNetworkConfiguration::BearerWLAN)
if(x.name() == "")
WiFisList << "Unknown(Other Network)";
else
WiFisList << x.name();
qDebug() << x.type();
for(int i=0; i<WiFisList.size(); i++)
bool exist = false;
QTreeWidgetItem * item = new QTreeWidgetItem();
for(int j=0; j<ui->treeWidgetWiFis->topLevelItemCount(); j++)
QTreeWidgetItem *index = ui->treeWidgetWiFis->topLevelItem(j);
QString str = index->text(1);
if(str == WiFisList[i])
exist = true;
break;
if(!exist)
item->setTextAlignment(0,Qt::AlignVCenter);
item->setTextAlignment(1,Qt::AlignHCenter);
item->setText(0,QString::number(++foundCount));
item->setText(1,WiFisList[i]);
ui->treeWidgetWiFis->addTopLevelItem(item);
.h 文件:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTimer>
#include <QList>
#include <QInputDialog>
#include <QStandardItem>
#include <QStandardItemModel>
#include <QNetworkConfiguration>
#include <QNetworkConfigurationManager>
#include <QNetworkSession>
namespace Ui
class MainWindow;
class MainWindow : public QMainWindow
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
int foundCount;
QNetworkConfiguration netcfg;
QStringList WiFisList;
QList<QNetworkConfiguration> netcfgList;
public slots:
void findActiveWirelesses();
private:
Ui::MainWindow *ui;
QTimer *findTimer;
QStandardItemModel* listModel;
QNetworkSession *session;
;
#endif // MAINWINDOW_H
【讨论】:
非常感谢。我检查了一下这段代码。 @nightrayy 我更新我的答案。添加截图并解释更多。 我收到这样的错误:/home/krzysztof/Pulpit/QT-programy/WiFi/mainwindow.cpp:16: błąd: 'class Ui::MainWindow' has no member named 'treeWidgetWiFis' ui->treeWidgetWiFis->setColumnWidth(0,50);我添加了 QWidgetTree 但它没有帮助 有什么理由使用QTreeWidget
而不是QTableWidget
?
好的,我添加了 treeWidget 并将他重命名为 treeWidgetWifis 和窗口显示,但在控制台中只是 0以上是关于Qt 通过 QNetworkAccessManager 扫描 Wi-Fi的主要内容,如果未能解决你的问题,请参考以下文章