我們已知的網絡連接有3種:撥號、使用局域網以及代理上網。
無論哪一種上網方式都可以判斷網絡是否暢通,借此,我們來做一個判斷網絡是否暢通(存在)的程序,新建一個基類為QWidget的工程,不要UI。
添加新文件:C++Class → Class Name :isonl、Base Name :QWidget
頭函數 >> isonl.h。
1 #ifndef ISONL_H 2 #define ISONL_H 3 //撥號 4 #define INTERNET_CONNECTION_MODEM 1 5 //局域網 6 #define INTERNET_CONNECTION_LAN 2 7 //代理上網 8 #define INTERNET_CONNECTION_PROXY 4 9 //代理被占用 10 #define INTERNET_CONNECTION_MODEM_BUSY 8 11 12 #include <QWidget> 13 14 class isOnl : public QWidget 15 { 16 Q_OBJECT 17 public: 18 explicit isOnl(QWidget *parent = 0); 19 int a; //用來做一個標識 20 private slots: 21 void GetInternetConnectState(); //獲取Internet連接狀態 22 signals: 23 void returnisonline(int); //發射信號 24 public slots: 25 }; 26 27 #endif // ISONL_H
源代碼 >> isonl.cpp
#include "isonl.h" #include <QLibrary> #include <QTimer> //定義函數指針 typedef bool (*ConnectFun)(int* lpdwFlags,int dwReserved); isOnl::isOnl(QWidget *parent) : QWidget(parent) { a = -1; QTimer *timer=new QTimer(this); //新建一個定時器對象 connect(timer,SIGNAL(timeout()),this,SLOT(GetInternetConnectState())); timer->start(100); //時間間隔1秒。每1秒獲取一次, GetInternetConnectState(); } //獲得聯網方式 void isOnl::GetInternetConnectState() { QLibrary lib("Wininet.dll"); //如果正確加載了dll if(lib.load()) { bool bOnline=false;//是否在線 int flags; //獲取dll庫中的函數InternetGetConnectedState函數地址` ConnectFun myConnectFun=(ConnectFun)lib.resolve("InternetGetConnectedState"); //判斷是否連網 bOnline=myConnectFun(&flags,0); if(bOnline) { //在線:撥號上網 if ( flags & INTERNET_CONNECTION_MODEM ) //在線:撥號上網 { a=1; } else if(flags & INTERNET_CONNECTION_LAN) //在線:通過局域網 { a=2; } else if(flags & INTERNET_CONNECTION_PROXY) //在線:代理 { a=4; } } else { a = -1; } emit returnisonline(a);//信號發射出去 } }
在工程文件(widget.pro)中添加
1 QT += core gui network
此時,我們的網絡判斷已經做好,接下來是如何去運用。
在頭函數widget.h中
1 #include "isonl.h" 2 3 //定義私有變量 4 private: 5 isOnl *online; 6 7 //添加一個私有槽信號用來實現 8 private slots: 9 void showOnline(int); 10 11 //添加一個信號槽函數,與之相對 12 signals: 13 void returnisonline(int); 14 //這個函數好像是不能被省略,我的系統是Win10測試的時候如何沒有此函數,會導致出錯。
在源代碼widget.cpp中
1 //在構造函數中添加 2 online = new isOnl; 3 connect(online,SIGNAL(returnisonline(int)),this,SLOT(showOnline(int))); 4 5 //獲取網絡是否暢通 6 void Widget::showOnline(int a) 7 { 8 if(a == 1 || a == 2 || a == 4) 9 { 10 //當網絡暢通時執行這里面的內容 11 //label2 ->setStyleSheet("background-color:lightgreen;");//淺綠 12 } 13 else if(a == -1) 14 { 15 //當網絡中斷時執行這里面的內容 16 //label2 ->setStyleSheet("background-color:red;"); 17 } 18 19 }
以上就是Qt判斷網絡是否存在的內容,此內容還可以運用到:判斷網絡連接方式,有興趣的可以嘗試一下。
有問題請留言,或者聯系QQ:1285015525 也可以發郵箱1285015525@qq.com