項目實戰:Qt終端命令模擬工具 v1.0.0(實時獲取命令行輸出,執行指令,模擬ctrl+c中止操作)

需求

  在Qt軟件中實現部分終端控制命令行功能,使軟件內可以又好的模擬終端控制,提升軟件整體契合度。

 

Demo演示

  請添加圖片描述

  請添加圖片描述

  請添加圖片描述

運行包下載地址:

  CSDNf粉絲0積分下載:https://download.csdn.net/download/qq21497936/87418829
  QQ羣:博客首頁掃碼進入技術羣,點擊“文件”搜索“terminator”,羣內與博文同步更新)

 

功能描述 v1.0.0

  在這裏插入圖片描述

  • windows版本打開即可實時現實;
  • centOS打開抓不到默認的輸出只能抓到命令執行的輸出結果;
  • ubuntu等其他linux-arm沒有測試;
  • 可以執行單條指令;
  • 可以清空模擬ctrl+c結束正在操作的命令;
 

項目模塊化部署

  在這裏插入圖片描述

 

源碼

TerminatorWidget.h

#ifndef TERMINATORWIDGET_H
#define TERMINATORWIDGET_H



#include <QWidget>
#include <QThread>
#include <QTextCursor>

#include "TerminatorManager.h"

namespace Ui {
class TerminatorWidget;
}

class TerminatorWidget : public QWidget
{
    Q_OBJECT

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

protected:
    void initControl();

protected slots:
    void slot_recvData(QByteArray byteArray);
    void slot_recvDataError(QByteArray byteArray);

private slots:
    void on_pushButton_exec_clicked();

    void on_pushButton_stop_clicked();

    void on_pushButton_clear_clicked();

private:
    Ui::TerminatorWidget *ui;

private:
    QThread *_pTerminatorManagerThread;
    TerminatorManager * _pTerminatorManager;
};

#endif // TERMINATORWIDGET_H

在這裏插入圖片描述

TerminatorManager.h

#ifndef TERMINATORMANAGER_H
#define TERMINATORMANAGER_H

#include <QObject>
#include <QProcess>
#include <QTextCodec>

class TerminatorManager : public QObject
{
    Q_OBJECT
public:
    explicit TerminatorManager(QObject *parent = 0);

public:
    bool getRunning() const;
    void wirte(QByteArray byteArray);
    void stop();
    void ctrlC();

signals:
    void signal_recvData(QByteArray byteArray);
    void signal_recvDataError(QByteArray byteArray);

public slots:
    void slot_start();
    void slot_stop();

protected:
    void initControl();

protected slots:
    void slot_stateChanged(QProcess::ProcessState newState);
    void slot_readyReadStandardOutput();
    void slot_readyReadStandardError();
    void slot_write(QByteArray byteArray);
    void slot_ctrlC();

private:
    bool _running;              // 是否運行
    QProcess *_pProcess;        // 進程
    QTextCodec *_pTextCodec;    // 編碼,讀取數據轉化編碼時用
};

#endif // TERMINATORMANAGER_H

TerminatorManager.cpp

#include "TerminatorManager.h"

#include <QDebug>
#include <QDateTime>
//#define LOG qDebug()<<__FILE__<<__LINE__
//#define LOG qDebug()<<__FILE__<<__LINE__<<__FUNCTION__
//#define LOG qDebug()<<__FILE__<<__LINE__<<QThread()::currentThread()
//#define LOG qDebug()<<__FILE__<<__LINE__<<QDateTime::currentDateTime().toString("yyyy-MM-dd")
#define LOG qDebug()<<__FILE__<<__LINE__<<QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz")

TerminatorManager::TerminatorManager(QObject *parent)
    : QObject(parent),
      _running(false),
      _pProcess(0),
      _pTextCodec(0)
{
    initControl();
}

bool TerminatorManager::getRunning() const
{
    return _running;
}

void TerminatorManager::wirte(QByteArray byteArray)
{
    QMetaObject::invokeMethod(this, "slot_write", Q_ARG(QByteArray, byteArray));
}

void TerminatorManager::ctrlC()
{
    QMetaObject::invokeMethod(this, "slot_ctrlC");
}

void TerminatorManager::slot_start()
{
    if(_running)
    {
        LOG << "It's already running!!!";
        return;
    }

    // 初始化子線程中的相關類
    if(!_pProcess)
    {
        _pProcess = new QProcess();
        connect(_pProcess, SIGNAL(stateChanged(QProcess::ProcessState)),
                this, SLOT(slot_stateChanged(QProcess::ProcessState)));
        connect(_pProcess, SIGNAL(readyReadStandardOutput()),
                this, SLOT(slot_readyReadStandardOutput()));
        connect(_pProcess, SIGNAL(readyReadStandardError()),
                this, SLOT(slot_readyReadStandardError()));
#ifndef LINUX
            _pProcess->start("cmd");
            _pProcess->waitForStarted();
#else
//            _pProcess->start("bash");
            _pProcess->start("sh");
            _pProcess->waitForStarted();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章