• Qt判断网络是否在


    我们已知的网络连接有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

  • 相关阅读:
    CefSharp-基于C#的客户端开发框架技术栈开发全记录
    C#中HttpWebRequest、WebClient、HttpClient的使用详解
    蜘蛛侠网站-关注C#爬虫技术
    网络剪刀-NetCut
    JSON.stringify 格式化输出字符串
    Vue 3.0 provide 传值到子组件
    全局添加可执行的node脚本
    npm link
    低代码平台思路
    java jwt使用,springboot 整合java-jwt,java jwt工具类
  • 原文地址:https://www.cnblogs.com/CLXiao-1029/p/7248140.html
Copyright © 2020-2023  润新知