需求

  在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();
#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();
}
 

工程模板

  

项目实战:Qt终端命令模拟工具 v1.0.0(实时获取命令行输出,执行指令,模拟ctrl+c中止操作)的更多相关文章

  1. 终端的乐趣--Linux下有趣的终端命令或者工具【转】

    转自:https://blog.csdn.net/gatieme/article/details/52144603 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...

  2. [易学易懂系列|rustlang语言|零基础|快速入门|(25)|实战2:命令行工具minigrep(2)]

    [易学易懂系列|rustlang语言|零基础|快速入门|(25)|实战2:命令行工具minigrep(2)] 项目实战 实战2:命令行工具minigrep 我们继续开发我们的minigrep. 我们现 ...

  3. [易学易懂系列|rustlang语言|零基础|快速入门|(24)|实战2:命令行工具minigrep(1)]

    [易学易懂系列|rustlang语言|零基础|快速入门|(24)|实战2:命令行工具minigrep(1)] 项目实战 实战2:命令行工具minigrep 有了昨天的基础,我们今天来开始另一个稍微有点 ...

  4. Vue CLI 是如何实现的 -- 终端命令行工具篇

    Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统,提供了终端命令行工具.零配置脚手架.插件体系.图形化管理界面等.本文暂且只分析项目初始化部分,也就是终端命令行工具的实现. 0. 用法 ...

  5. 项目实战:Qt文件改名工具 v1.2.0(支持递归检索,搜索:模糊匹配,前缀匹配,后缀匹配;重命名:模糊替换,前缀追加,后缀追加)

    需求   在整理文件和一些其他头文件的时候,需要对其名称进行整理和修改,此工具很早就应该写了,创业后,非常忙,今天抽空写了一个顺便提供给学习.   工具和源码下载地址   本篇文章的应用包和源码包可在 ...

  6. Windows终端命令行工具Cmder

    在IT这一行,大部分情况下都是推荐大家使用Linux或者类Unix操作系统去编程,Linux作为一代优秀的操作系统,已经人尽皆知,在IT行业已经成为核心.有条件的大佬都选择了使用mac编程,最优秀的莫 ...

  7. AJ学IOS 之微博项目实战(12)发送微博自定义工具条代理实现点击事件

    AJ分享,必须精品 一:效果 二:封装好的工具条 NYComposeToolbar.h 带代理方法 #import <UIKit/UIKit.h> typedef enum { NYCom ...

  8. 今日头条、抖音、西瓜、火山、微视、陌陌等自媒体平台小视频批量下载工具v1.1.0(视频搬运福利)

    前言 目前各大自媒体平台爆火,网络流量暴涨,各大自媒体平台的小视频为广大个广告主带来了如泉涌般的的视频流量,更给广大的自媒体小编带来了丰厚的利益回报,想要创做更多的自媒体内容着实不易,下面给广大的小视 ...

  9. Blend打不开wpf项目,提示无法识别的工具版本“12.0”

          讲项目文件用记事本打开然后修改为“14.0”即可        

  10. Android项目实战(四十):Andoird 7.0+ 安装APK适配

    首先看一下安装apk文件的代码 /** * 通过隐式意图调用系统安装程序安装APK */ public static void install(Context context) { Intent in ...

随机推荐

  1. MySQL数据库页存储结构学习与了解

    MySQL数据库页存储结构学习与了解 背景 MySQL总是出现奇奇怪怪的问题. 想着自己能够学习与提高一下. 最近看了很多文档.关于MySQL数据库相关的. 想着总结和提炼一下, 希望能够给未来的工作 ...

  2. [转帖]重置 VCSA 6.7 root密码和SSO密码

    问题描述 1.用root用户登录 VMware vCenter Server Appliance虚拟机失败,无法登录 2.vCenter Server Appliance 6.7 U1的root帐户错 ...

  3. VM PowerCli的简单安装和使用学习

    1. Win10 上面安装 下载 zip包并且进行安装 win10 已经带了powershell 安装比较简单, 只不过安装时会提示 powershell的权限有问题需要打开powershell 执行 ...

  4. Nacos集群启动注意事项

    简介 Nacos是阿里巴巴开源的一套服务注册发现的应用 使用简单灵活, 是spring Cloud Alibaba的组成部分 现在拆分微服务的部署情况下,极大的需求nacos服务作为支撑 单点情况下存 ...

  5. 一文搞懂Go GC演进史,讲的太细致了!

    最近在和 Go就业训练营 的朋友讨论Go GC的问题,发现了刘丹冰老师总结的内容,写的太好了,和大家分享一下. 我们的讨论和思考也整理到这篇文章中了,希望对你有启发. 垃圾回收(Garbage Col ...

  6. 【JS 逆向百例】当乐网登录接口参数逆向

    声明 本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 逆向目标 目标:当乐网登录 主页:https://oauth.d.cn ...

  7. 使用emmylua调试slua

    使用emmylua调试slua的方法 在lua的入口中加上emmylua的debug代码 在slua的LuaState.loaderDelegate委托中,添加判断如果是load_file_name= ...

  8. Similarities:精准相似度计算与语义匹配搜索工具包,多维度实现多种算法,覆盖文本、图像等领域,支持文搜、图搜文、图搜图匹配搜索

    Similarities:精准相似度计算与语义匹配搜索工具包,多维度实现多种算法,覆盖文本.图像等领域,支持文搜.图搜文.图搜图匹配搜索 Similarities 相似度计算.语义匹配搜索工具包,实现 ...

  9. 【2】Anaconda下:ipython文件的打开方式,Jupyter Notebook中运行.py文件,快速打开ipython文件的方法!

    相关文章: [1]Anaconda安装超简洁教程,瞬间学会! [2]Anaconda下:ipython文件的打开方式,Jupyter Notebook中运行.py文件,快速打开ipython文件的方法 ...

  10. 19.13 Boost Asio 发送TCP流数据

    Boost框架中默认就提供了针对TCP流传输的支持,该功能可以用来进行基于文本协议的通信,也可以用来实现自定义的协议.一般tcp::iostream会阻塞当前线程,直到IO操作完成. 首先来看服务端代 ...