另开一个线程,在子线程中开启一个QProcess进程,设一个定时器每隔一定时间Ping设备的IP地址,若能Ping通,则不做任何处理,若Ping不通,则发送弹窗报警。
下面为部分代码:
Ping.h
#pragma once
#include "qobject.h"
#include <QNetworkInterface>
#include <qdebug.h>
#include <qtimer.h>
#include <qthread.h>
#include <qdatetime.h>
#include <QProcess>
#include <qsettings.h>
#include <qhostinfo.h>
#pragma execution_character_set("utf-8")
#pragma warning( disable : 4819 )
class Ping : public QObject
{
Q_OBJECT
public:
Ping(QObject *parent = nullptr);
virtual ~Ping();
QString m_msg = "";
private:
QProcess* cmd;
QTimer *timer;
private:
void sendMsgBox(QString msg);
signals :
void signal_msgboxWarning(QString msg);
public slots :
void slot_pingIP();
};
Ping.cpp
#include "Ping.h"
Ping::Ping(QObject *parent)
{
}
Ping::~Ping()
{
if (timer->isActive()) {
timer->stop();
delete timer;
}
cmd->close();
cmd->kill();
delete cmd;
}
void Ping::slot_pingIP()
{
cmd = new QProcess();
timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, [=]()
{
//QProcess *cmd = new QProcess;
cmd->start("ping 192.168.1.228"); // 等待ping 的结果
while (cmd->waitForFinished())
{
QString result = QString::fromLocal8Bit(cmd->readAll());
qDebug() << result;
if (result.indexOf("TTL") == -1)
{
sendMsgBox("网线被拔掉或其他原因,连接已断开");
}
}
});
timer->start(10000);
}
//弹窗信号
void Ping::sendMsgBox(QString msg)
{
if (m_msg != msg)
{
emit signal_msgboxWarning(msg);
m_msg = msg;
}
else
{
m_msg = msg;
}
}
MainWindow.h
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_MainWindow.h"
#include <QNetworkInterface>
#include <qdebug.h>
#include <qtimer.h>
#include <qthread.h>
#include <qdatetime.h>
#include <QProcess>
#include "Ping.h"
#include <qmessagebox.h>
#pragma execution_character_set("utf-8")
#pragma warning( disable : 4819 )
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = Q_NULLPTR);
~MainWindow();
Ping* m_ping;
QThread* m_pingThread;
signals:
void signal_pingIP();
private slots :
//设置弹窗警告
void slot_msgBoxWarning(QString msgText);
private:
Ui::MainWindowClass ui;
};
MainWindow.cpp
#include "MainWindow.h"
#include <QNetworkInterface>
#include <qdebug.h>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
m_ping = new Ping();
m_pingThread = new QThread();
m_ping->moveToThread(m_pingThread);
m_pingThread->start();
connect(this, &MainWindow::signal_pingIP, m_ping, &Ping::slot_pingIP);
emit signal_pingIP();
connect(m_ping, &Ping::signal_msgboxWarning, this, &MainWindow::slot_msgBoxWarning);
}
MainWindow::~MainWindow()
{
m_pingThread->quit();
m_pingThread->wait();
delete m_ping;
}
//设置弹窗警告
void MainWindow::slot_msgBoxWarning(QString msgText)
{
qDebug() << "MainWindow弹窗:" << msgText;
QMessageBox box;
box.setStyleSheet("QLabel{"
"min-width:250px;"
"min-height:200px; "
"font-size:24px;"
"color:red;"
"font-weight: 400;"
"text-align:center;"
//"background-color: rgb(255, 222, 223);"
"}");
box.setText(msgText);
box.setWindowTitle(QString::fromUtf8("警告"));
box.setIcon(QMessageBox::Icon::Warning);
box.setButtonText(QMessageBox::Ok, QString::fromUtf8("确定"));
box.exec();
}