2017-08-03 379 views
1

欢迎我在扫描Wi-Fi以获取Wi-Fi上所有可用连接时遇到问题。我已经编写了这段代码:Qt通过QNetworkAccessManager扫描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 但我不知道该怎么做。

+0

我想获得可用的设备列表我可以通过wifi连接。我已阅读allConfigurations使其成为可能,但我无法使其工作。 – nightrayy

+0

函数'allConfigurations'返回'QList '你不能qDebug它。 – aghilpro

+0

好吧,我让你一个简单的应用程序来做到这一点。 – aghilpro

回答

0

使用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); 
     } 
    } 
} 

.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 
+0

非常感谢。我检查了一下这段代码。 – nightrayy

+0

@nightrayy我更新我的答案。添加截图并解释更多。 – aghilpro

+0

我得到这样的错误:/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,但它没有帮助 – nightrayy