Qt|Linux工作筆記-非同步呼叫ping命令,重定向獲取資訊,介面顯示
阿新 • • 發佈:2018-11-15
邏輯:
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"); }