1.前言
最近遇到项目需要用到IP地址批量ping,cmd命令行一个个去敲太麻烦,写个bat批处理的话方便是方便,奈何不怎么会,于是只好自己动手用QT实现一个。
其实也不难,无非就是利用QProcess类开始一个控制台终端,模拟输入ping命令,然后解析结果以及界面反馈。
话不多说,直接上代码
2.代码
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QProcess>
#include <QDebug>
#include <QRegExp>
#include <QDir>
#include <QTimer>
#include <QFuture>
#include <QtConcurrent/QtConcurrent>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_btn_start_clicked();
private:
Ui::MainWindow *ui;
QProcess *m_process=Q_NULLPTR;
quint16 m_cport=0;
QString m_singleArray;
QString m_IPfrom;
bool m_quit=false;
private slots:
void on_btn_stop_clicked();
Q_INVOKABLE void set_style(quint8 id,bool f);
private:
void start_work();
void inittable();
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
inittable();
}
MainWindow::~MainWindow()
{
m_quit=true;
delete ui;
}
void MainWindow::start_work()
{
QFuture<void> fu = QtConcurrent::run([this](){
quint8 index = 0;
m_process = new QProcess;
while(++index<255 && !m_quit ){
m_process->start(QString("ping 192.168.5.%1 -w 500 -n 1").arg(index));
if (m_process->waitForFinished()){
QString redata = QString::fromLocal8Bit(m_process->readAll());
qDebug()<<redata;
bool isok = false;
if (redata.indexOf("TTL") == -1){
qDebug()<<"无法连接";
}else{
qDebug()<<"连接OK";
isok=true;
}
QMetaObject::invokeMethod(this,"set_style",Qt::AutoConnection, Q_ARG(quint8,index),Q_ARG(bool,isok));
}
}
m_process->close();
delete m_process;
});
}
void MainWindow::inittable()
{
ui->tableWidget->setColumnCount(25);
ui->tableWidget->setRowCount(11);
ui->tableWidget->horizontalHeader()->setVisible(false);
ui->tableWidget->verticalHeader()->setVisible(false);
ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);//ResizeToContents自适应宽度,Stretch各列平均分配列宽
ui->tableWidget->verticalHeader()->setDefaultSectionSize(30);//设置默认行高
ui->tableWidget->horizontalHeader()->setDefaultSectionSize(50);
ui->tableWidget->horizontalHeader()->setStretchLastSection(true); //设置充满表宽度
ui->tableWidget->setFrameShape(QFrame::NoFrame); //设置无边框
// ui->tableWidget->setShowGrid(false); //设置不显示格子线
ui->tableWidget->setSelectionMode(QAbstractItemView::NoSelection); //可多选(Ctrl、Shift、 Ctrl+A都可以)
// ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectItems); //设置选择行为时每次选择一行
ui->tableWidget->horizontalHeader()->resizeSection(0,50); //设置表头第一列的宽度为150
ui->tableWidget->horizontalHeader()->setFixedHeight(50); //设置表头的高度
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
for(int i=0;i<255;++i){
QTableWidgetItem* item = new QTableWidgetItem(QString::number(i+1));
ui->tableWidget->setItem(i/25,i%25,item);
}
}
void MainWindow::set_style(quint8 id, bool f)
{
int r = (id-1) / 25;
int c = (id-1) % 25;
if(r<0 || c<0) return;
ui->tableWidget->item(r,c)->setBackgroundColor(f?QColor(0,255,0) : QColor(255,0,0));
}
void MainWindow::on_btn_start_clicked()
{
m_IPfrom = ui->lineEdit->text();
if(m_IPfrom.compare("..")==0) return;
m_quit=false;
start_work();
}
void MainWindow::on_btn_stop_clicked()
{
m_quit=true;
}
3.演示
绿色表示能ping通
红色表示无法ping通或超时
网段为需要测试网段,当前为192.168.5.x
起始表示开始ping的ip,此处为1,表示从192.168.5.1到192.168.5.255
点开始即开始运行,停止则终止运行