專案實戰:Qt終端命令模擬工具 v1.0.0(實時獲取命令列輸出,執行指令,模擬操作)

21497936發表於2023-02-06

需求

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

Demo演示

   請新增圖片描述

   請新增圖片描述

   請新增圖片描述

功能描述 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_OBJECTpublic:
    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_OBJECTpublic:
    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();#endif
    }
    _running = true;}void TerminatorManager::slot_stop(){
    if(!_running)
    {
        LOG << "It's not running!!!";
        return;
    }
    if(_pProcess)
    {
        _pProcess->kill();
        _pProcess->close();
        _pProcess->waitForFinished();
        _pProcess->deleteLater();
        _pProcess = 0;
    }
    _running = false;}void TerminatorManager::initControl(){
    // linux下有可能獲取失敗
    _pTextCodec = QTextCodec::codecForName("System");}void TerminatorManager::slot_stateChanged(QProcess::ProcessState newState){
    LOG << newState;}void TerminatorManager::slot_readyReadStandardOutput(){
    QByteArray byteArray = _pProcess->readAllStandardOutput();//    QByteArray byteArray = _pProcess->readAll();
    QString str;
    // 轉換為unicode
    if(_pTextCodec)
    {
        str = _pTextCodec->toUnicode(byteArray);
    }else{
        str = QString(byteArray);
    }
    emit signal_recvData(str.toUtf8());}void TerminatorManager::slot_readyReadStandardError(){
    QByteArray byteArray = _pProcess->readAllStandardError();
    QString str;
    // 轉換為unicode
    if(_pTextCodec)
    {
        str = _pTextCodec->toUnicode(byteArray);
    }else{
        str = QString(byteArray);
    }
    emit signal_recvDataError(str.toUtf8());}void TerminatorManager::slot_write(QByteArray byteArray){
    if(!_pProcess)
    {
        LOG << "Is't not running";
        return;
    }
    LOG << QString(byteArray);
    LOG << _pProcess;
    _pProcess->write(byteArray);
    LOG;}void TerminatorManager::slot_ctrlC(){
    if(!_running)
    {
        LOG << "It's not running!!!";
        return;
    }
    slot_stop();
    slot_start();}

工程模板

   在這裡插入圖片描述


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010283/viewspace-2934035/,如需轉載,請註明出處,否則將追究法律責任。

相關文章