当前位置: 首页 > news >正文

Qt封装ping命令并将ping结果显示到界面

实现界面及在Windows 10下的运行结果如下:

代码如下:

pingNetWork.h

// 检测网络是否ping通的工具#ifndef PINGNETWORK_H
#define PINGNETWORK_H#include <QWidget>
#include"control_global.h"
namespace Ui {
class CPingNetWork;
}class CONTROL_EXPORT CPingNetWork : public QWidget
{Q_OBJECTpublic:explicit CPingNetWork(QWidget *parent = nullptr);~CPingNetWork();signals:void pingResultSignal(const QString&qsPingRst);private:void initUI();void pingSlot();void clearResultSlot();void pingThreadFun(const QString&destIp);void pingResult(const QString& qsPingRst);private:Ui::CPingNetWork *ui;bool m_bPing{true};
};#endif // PINGNETWORK_H
pingNetWork.cpp
#include "pingNetWork.h"
#include "ui_pingNetWork.h"
#include<QRegExp>
#include<QRegExpValidator>
#include<thread>
#include<QProcess>
using namespace std::literals;CPingNetWork::CPingNetWork(QWidget *parent) :QWidget(parent),ui(new Ui::CPingNetWork)
{ui->setupUi(this);initUI();connect(ui->startPingBtn, &QAbstractButton::clicked, this, &CPingNetWork::pingSlot);connect(this, &CPingNetWork::pingResultSignal, this, &CPingNetWork::pingResult);connect(ui->clearResultBtn, &QAbstractButton::clicked, this, &CPingNetWork::clearResultSlot);
}CPingNetWork::~CPingNetWork()
{m_bPing = false;delete ui;
}void CPingNetWork::initUI()
{ui->startPingBtn->setFixedSize(120, 60);ui->IPLineEdit->setFixedWidth(220);ui->clearResultBtn->setFixedSize(120, 60);ui->clearResultBtn->setFixedWidth(220);QRegExp rx("((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)");auto pExpValidator = new QRegExpValidator(rx, this);ui->IPLineEdit->setValidator(pExpValidator);ui->IPLineEdit->setText(QLatin1String("127.0.0.1"));
}void CPingNetWork::clearResultSlot()
{ui->networkTestRst->clear();
}void CPingNetWork::pingSlot()
{if(!ui->startPingBtn->text().compare(QStringLiteral("开始Ping(&P)"))){m_bPing = true;ui->startPingBtn->setText(QStringLiteral("停止Ping(&W)"));auto destIp = ui->IPLineEdit->text();// 开启一个线程,用来一直pingstd::thread pingThread(&CPingNetWork::pingThreadFun, this, destIp);pingThread.detach();}else{m_bPing = false;ui->startPingBtn->setText(QStringLiteral("开始Ping(&P)"));}
}void CPingNetWork::pingResult(const QString& qsPingRst)
{ui->networkTestRst->append(qsPingRst);
}void CPingNetWork::pingThreadFun(const QString&destIp)
{QProcess pingProcess;QString strArg, qsStdout;#ifdef Q_OS_WIN  // "ping IP  -n 1 -i 2 "只Windows支持,linux不支持strArg = QLatin1String("ping ") + destIp + QLatin1String(" -n 1 -i 2");pingProcess.start(strArg, QIODevice::ReadOnly);pingProcess.waitForFinished(-1);qsStdout = QString::fromLocal8Bit(pingProcess.readAllStandardOutput());emit pingResultSignal(qsStdout);
#endif// windows、Linux连续ping命令格式不同,需要区分
#ifdef Q_OS_WINstrArg = QLatin1String("ping ") + destIp + QLatin1String(" -t");
#elif Q_OS_UNIXstrArg = QLatin1String("ping ") + destIp;
#endifwhile (m_bPing){pingProcess.start(strArg, QIODevice::ReadOnly);pingProcess.waitForFinished(300);qsStdout = QString::fromLocal8Bit(pingProcess.readAllStandardOutput());
#ifdef Q_OS_WIN // windows两次ping返回的报文之间有时会插入空行,过滤掉auto index = qsStdout.indexOf("\r\n");if(-1 == index){continue;}
#endifemit pingResultSignal(qsStdout);std::this_thread::sleep_for(800ms);}}

说明:

  • ui->IPLineEdit用来输入ping的目的机器的IP地址。其通过36行的正则表达式限定只能输入IP地址格式的数字,该正则表达式的具体含义,参见:利用QLineEdit的正则表达式校验器显示IP地址 博文。
  • ui->startPingBtn、ui->clearResultBtn分别是上述界面的“开始ping”、“清除结果”按钮。
  • 程序难懂的部分作了注释,程序很容易看懂,不再具体描述。
http://www.lryc.cn/news/350694.html

相关文章:

  • 图论(洛谷刷题)
  • 安卓部署ffmpeg全平台so并实现命令行调用
  • Go语言中MD5盐值加密解决用户密码问题
  • flutter开发实战-本地SQLite数据存储
  • 【路由組件】
  • 【C++风云录】数字逻辑设计优化:电子设计自动化与集成电路
  • Flask Response 对象
  • 算法001:移动零
  • 基于springboot+vue+Mysql的网上书城管理系统
  • python实现绘制烟花代码
  • Python小白的机器学习入门指南
  • 学校上课,是耽误我学习了。。
  • OpenFeign高级用法:缓存、QueryMap、MatrixVariable、CollectionFormat优雅地远程调用
  • python基础之函数
  • 深入理解C#中的IO操作 - FileStream流详解与示例
  • 信息泄露--注意点点
  • 位运算符
  • 云上聚智——移动云云服务器进行后端的搭建及部署
  • C语言程序的编译
  • 滴滴三面 | Go后端研发
  • 深度学习之基于Yolov3的行人重识别
  • 防火墙最新技术汇总
  • PikaUnsafe upfileupload
  • git拉取项目前需要操作哪些?
  • 报名开启!2024 开源之夏丨Serverless Devs 课题已上线!
  • DataBinding viewBinding(视图绑定与数据双向绑定)简单案例 (kotlin)
  • TensorFlow基于anaconda3快速构建
  • 力扣72-编辑距离
  • K8S 删除pod的正确步骤
  • 羊大师分析,羊奶健康生活的营养源泉