需求
在Qt軟件中實現部分終端控制命令行功能,使軟件內可以又好的模擬終端控制,提升軟件整體契合度。
CSDNf粉絲0積分下載:https://download.csdn.net/download/qq21497936/87418829
QQ羣:博客首頁掃碼進入技術羣,點擊“文件”搜索“terminator”,羣內與博文同步更新)
- windows版本打開即可實時現實;
- centOS打開抓不到默認的輸出只能抓到命令執行的輸出結果;
- ubuntu等其他linux-arm沒有測試;
- 可以執行單條指令;
- 可以清空模擬ctrl+c結束正在操作的命令;
#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
#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
#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();