1. 程式人生 > >Qt|Linux工作筆記-非同步呼叫ping命令,重定向獲取資訊,介面顯示

Qt|Linux工作筆記-非同步呼叫ping命令,重定向獲取資訊,介面顯示

邏輯:

1.使用QProcess在開執行緒前設定輸出檔案【setStandardOutputFile】;

2.開一個執行緒,去專門呼叫shell命令,比如ping;

3.Qt讀取重定向檔案,進行介面顯示;

 

程式執行截圖如下:

 

原始碼如下:

widget.h


QT_BEGIN_NAMESPACE
class QProcess;
class QTimer;
QT_END_NAMESPACE

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

    void removeExistFile(const QString fileName);
    void getTopInformation(const QString cmd, const QString fileName);


protected slots:
    void readTopInfo();
    void pingBtnClicked();

private:
    Ui::Widget *ui;
    QProcess *m_process;
    QTimer *m_readTime;
    QString m_outputFileName;
};

#endif // WIDGET_H

main.cpp

clude <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QProcess>
#include <QEventLoop>
#include <QTimer>
#include <QDebug>
#include <QFile>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    m_outputFileName = "ping.txt";
    removeExistFile(m_outputFileName);
    this->setWindowTitle("CSDN IT1995");

    m_process = new QProcess;
    connect(ui->pushButton, SIGNAL(clicked(bool)), this, SLOT(pingBtnClicked()));
}

Widget::~Widget()
{
    delete ui;
}

void Widget::removeExistFile(const QString fileName)
{
    if(QFile::exists(fileName)){
        if(QFile::remove(fileName)){
            qDebug() << fileName + " is discovered! remove successful";
        }
        else{
            qDebug() << fileName + " remove failed";
        }
        return;
    }

    qDebug() << fileName + "is undiscovered!";
}

void Widget::getTopInformation(const QString cmd, const QString fileName)
{
   m_process->setStandardOutputFile(fileName);
   m_process->start(cmd);
   QEventLoop loop;
   m_readTime = new QTimer;
   connect(m_readTime, SIGNAL(timeout()), this, SLOT(readTopInfo()));
   connect(m_process, SIGNAL(finished(int,QProcess::ExitStatus)), &loop, SLOT(quit()));
   m_readTime->start(500);
   loop.exec();
}

void Widget::readTopInfo()
{
    QFile file("ping.txt");
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text)){
        qDebug() << "open failed!";
        return;
    }
    QTextStream in(&file);
    QString pingFileInfo = in.readAll();
    QStringList lineList = pingFileInfo.split("\n");

    ui->listWidget->clear();
    for(int i = 0; i < lineList.size(); i++){
        ui->listWidget->insertItem(i, lineList[i]);
    }
}

void Widget::pingBtnClicked()
{
    QString ipOrUrl = ui->lineEdit->text();
    QString cmd = "ping " + ipOrUrl;

    ui->pushButton->setEnabled(false);
    getTopInformation(cmd, "ping.txt");
}