Qt使用QNetworkAccessManager扫描Wi-Fi

4

欢迎!我遇到了一个问题,想要扫描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();

}

我有一个显示所有配置的问题。我已经阅读了文档Qt网络配置管理器,但我不知道如何做到这一点。


我想获取可以通过WiFi连接的可用设备列表。我已经阅读了所有配置,使其成为可能,但我无法使其工作。 - nightrayy
函数 allConfigurations 返回 QList<QNetworkConfiguration>,你不能使用 qDebug。 - Farhad
好的,我会为您制作一个简单的应用程序来完成这个任务。 - Farhad
int count = QNetworkConfiguration::Active; 看起来不正确。您并没有获取活动设备的数量,而是存储了一个枚举的int值。请编辑您的问题,而不是通过发布评论来完成它。 - Benjamin T
最好使用本地方法获取WiFi网络的SSID,因为不能保证“QNetworkConfiguration”始终返回网络的SSID。如果是Windows,则使用Windows库;如果是Android,则通过Java使用Android WiFi服务;如果是iOS,则使用Objective C。 - Masthan
1个回答

5

使用QNetworkAccessManager扫描 Wi-Fi 网络。

我使用 QNetworkConfigurationManager 类获取所有可用的 WiFi 并将它们显示在 QTreeWidget 中。

QNetworkConfigurationManager ncm; netcfgList = ncm.allConfigurations();

App Screenshot

.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);
        }
    }
}

头文件:

#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
@nightrayy,我更新了我的答案。添加了截图并进行了更详细的解释。 - Farhad
有什么理由使用 QTreeWidget 而不是 QTableWidget 吗? - Mike
@nightrayy 看看我的截图,对我来说是有效的。你确定你所在地区有可用的WiFi网络吗? - Farhad
@nightrayy 下载这个简单的应用并运行它。这里 - Farhad
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接