首页 > 其他分享 >调用CMD

调用CMD

时间:2024-12-03 14:23:54浏览次数:12  
标签:SLOT 调用 process SIGNAL CMD ui connect MainWindow

1.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QProcess>
#include <handleapi.h>
#include <QShortcut>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;
    QProcess *process;
    QShortcut *key;

public slots:
    void write_cmd();
    void read_data();
    void finished_process();
    void error_process();

};

#endif // MAINWINDOW_H

 2.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <qDebug>
#include <QShortcut>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{


    ui->setupUi(this);

    setWindowTitle("cmd text");
    ui->lineEdit->setText(tr("ping www.baidu.com"));
    ui->textEdit->setLineWrapMode(QTextEdit::NoWrap);

    /* 新建process */
    process = new QProcess(this);
    process->setProcessChannelMode(QProcess::MergedChannels);

    /* 回车 */
    ui->pushButton_Enter->setFocus();
    ui->pushButton_Enter->setShortcut(QKeySequence::InsertParagraphSeparator);
    ui->pushButton_Enter->setShortcut(Qt::Key_Enter);
    ui->pushButton_Enter->setShortcut(Qt::Key_Return);

    /* 按键相关 */
    connect(ui->pushButton,SIGNAL(clicked()),ui->lineEdit,SLOT(clear()));                           //清除命令行
    connect(ui->pushButton_Enter,SIGNAL(clicked()),this,SLOT(write_cmd()));                         //回车按钮
    connect(ui->pushButton_Clear,SIGNAL(clicked()),ui->textEdit,SLOT(clear()));                     //清除文本框按钮

    /* 命令行相关 */
    connect(process,SIGNAL(readyRead()),this,SLOT(read_data()));                                    //读命令行数据
    connect(process,SIGNAL(readyReadStandardOutput()),this,SLOT(read_data()));                      //读命令行标准数据(兼容)
    connect(process,SIGNAL(errorOccurred(QProcess::ProcessError)),this,SLOT(error_process()));      //命令行错误处理
    connect(process,SIGNAL(finished(int)),this,SLOT(finished_process()));                           //命令行结束处理

    /* 焦点相关 */
    connect(ui->pushButton,SIGNAL(clicked()),ui->lineEdit,SLOT(setFocus()));
    connect(ui->pushButton_Enter,SIGNAL(clicked()),ui->lineEdit,SLOT(setFocus()));
    connect(ui->pushButton_Clear,SIGNAL(clicked()),ui->lineEdit,SLOT(setFocus()));

    process->start("cmd.exe");
}

MainWindow::~MainWindow()
{
    /* 关闭cmd */
    process->close();

    /* 释放空间 */
    delete ui;
    delete process;

    /* 拴住 */
    ui = NULL;
    process = NULL;

    /* 信息输出 */
    qDebug() << "end Process" << endl;
}

void MainWindow::write_cmd()
{
    /* 获得命令,\r\n代替键盘的Enter,没有则不会执行 */
    QString cmd = ui->lineEdit->text() + "\r\n";
    ui->lineEdit->clear();
    ui->lineEdit->setFocus();

    qDebug()<<"QString:"<<cmd;
    /* 转为char*并写入 */
    //QByteArray qbarr = cmd.toLatin1();
    QByteArray qbarr = cmd.toLocal8Bit();
    //QByteArray qbarr = cmd.toUtf8();
    qDebug()<<"QByteArray:"<<qbarr;
    char *ch = qbarr.data();
    qint64 len = cmd.length();
    qDebug()<<"char *:"<<ch;
    //在从cmd--->ch的过程中,中文数据被破坏了。成了"???"
    process->write(ch, len);

    QString str(qbarr);
    qDebug()<<"QString:"<<str;
    /* 信息输出 */
    //qDebug() << "Success:write_cmd:" << cmd << endl;
}

void MainWindow::read_data()
{
    /* 接收数据 */
    QByteArray bytes = process->readAll();

    /* 显示 */
    QString msg = QString::fromLocal8Bit(bytes);
    ui->textEdit->append(msg);
    ui->textEdit->update();

    /* 信息输出 */
    qDebug() << "Success:read_data:" << msg << endl;

}

void MainWindow::finished_process()
{
    /* 接收数据 */
    int flag = process->exitCode();

    /* 信息输出 */
    qDebug() << "Success:finishedProcess():" << flag << endl;
}

void MainWindow::error_process()
{
    /* 接收数据 */
    int err_code  = process->exitCode();
    QString err = process->errorString();

    /* 显示 */
    ui->textEdit->append(QString("error coed:%1").arg(err_code));
    ui->textEdit->append(err);

    /* 信息输出 */
    qDebug() << "Success:error_process():" << err << endl;
}





#if 0
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <qDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->lineEdit->setText(tr("ping www.baidu.com"));
    ui->textEdit->setLineWrapMode(QTextEdit::NoWrap);

    process = new QProcess(this);
    process->setProcessChannelMode(QProcess::MergedChannels);

    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(write_cmd()));
    connect(process,SIGNAL(readyReadStandardOutput()),this,SLOT(read_data()));
    connect(process,SIGNAL(errorOccurred(QProcess::ProcessError)),this,SLOT(read_data()));
    connect(process,SIGNAL(finished(int)),this,SLOT(finished_process()));
}

MainWindow::~MainWindow()
{
    /* 关闭cmd */
    process->close();

    /* 释放空间 */
    delete ui;
    delete process;

    /* 拴住 */
    ui = NULL;
    process = NULL;

    /* 信息输出 */
    qDebug() << "end Process" << endl;
}

void MainWindow::write_cmd()
{
    /* 获得命令 */
    QString cmd = ui->lineEdit->text();

    /* 解析命令 */
    //QStringList args = cmd.split('&');

    process->start("cmd.exe", QStringList() << "/c" << cmd);

#if 0
    /* 转为char* */
    QByteArray qbarr = cmd.toLatin1();
    char *ch = qbarr.data();
    qDebug() << process->write(ch) << ":" << cmd;
#endif

    /* 信息输出 */
    qDebug() << cmd << "write_cmd" << endl;
}

void MainWindow::read_data()
{
    /* 判断是正确还是错误 */
    QByteArray bytes = process->readAllStandardOutput();
    if(bytes.isEmpty())
    {
        /* 错误 */
        int err_code  = process->exitCode();
        QString err = process->errorString();

        ui->textEdit->append(QString("error coed:%1").arg(err_code));
        ui->textEdit->append(err);

        qDebug() << err <<endl;

    }
    else
    {
        /* 正确 */
        QString msg = QString::fromLocal8Bit(bytes);
        ui->textEdit->append(msg);

        qDebug() << msg <<endl;
    }
    ui->textEdit->update();

    /* 信息输出 */
    qDebug() << "read_data" << endl;
}

void MainWindow::finished_process()
{
    /* 信息输出 */
    qDebug() << "finishedProcess" << endl;
}
#endif

  3.示例

 

标签:SLOT,调用,process,SIGNAL,CMD,ui,connect,MainWindow
From: https://www.cnblogs.com/wuyuan2011woaini/p/18583963

相关文章

  • 在普通网页中如何调用html5+的plus对象?
    在普通网页中无法直接调用HTML5+的plus对象。plus对象是5+Runtime提供的,只能在5+App或uni-app项目中使用。普通网页运行在浏览器环境中,不具备5+Runtime的能力。如果你想在普通网页中使用类似plus对象提供的原生能力,你需要考虑以下几种方案:使用浏览器提供的......
  • 【SpringCloud】LoadBalancer——服务调用与负载均衡
    基本介绍主要功能:LoadBlancer的主要作用就是提供客户端软件的负载均衡,然后由OpenFeign去调用具体的微服务。负载均衡的算法,分为轮询和随机。使用场景:订单模块的负载均衡。通过消费者模块,访问订单支付模块(子模块8001/8002/8003)例子前提:已经使用了注册服务中心(https://www.cn......
  • 帝国CMS用PHP调用栏目导航标签并高亮简单版
    <?php$sql=$empire->query("selectclassid,sonclass,classname,islast,islistfrom{$dbtbpre}enewsclasswherebclassid=0andshowclass=0orderbymyorder,myorderasc");while($s=$empire->fetch($sql)){$classurl=sys_ReturnBqClas......
  • Esbuild代码调用深度解析:Build API与Transform API的奥秘 (3)
    esbuild提供了丰富的API,允许你在Node.js代码中进行项目打包和代码转换。以下是esbuild的主要API和一些示例用法。项目打包——BuildAPIesbuild的BuildAPI主要用于项目打包,提供了build、buildSync和context三个方法。1.基本配置在项目根目录下创建esb......
  • PbootCMS模板指定内容标签调用
    调取指定内容:html {pboot:contentid=*}<ahref="[content:link]">[content:title]</a>{/pboot:content}控制参数:id=*:内容的ID号,必填scode=*:单页的分类编码,必填,仅适用于单页内容可使用的内容标签:[content:id]:编号[content:scode]:栏目编码[content:subscode......
  • PbootCMS站点信息调用
    站点信息标签适用范围:全站任意地方均可使用。标签作用:用于调取网站的基本配置信息,对应后台的“基础内容>站点信息”。示例代码:html{pboot:siteindex}站点入口地址{pboot:sitepath}站点路径{pboot:sitelanguage}站点语言{pboot:sitetitle}站点标题{pboot:sitesubtitle}站点......
  • PbootCMS翻页分页条标签如何调用
    分页条标签:{page:bar}:系统内置的完整分页条{page:current}:当前页码{page:count}:总页数{page:rows}:总数据行数{page:index}:首页链接{page:pre}:前一页链接{page:next}:下一页链接{page:last}:尾页链接{page:status}:分页状态信息{page:numbar}:数字条......
  • Python 元类机制的工作流程及参数调用的不同
    classMymeta(type):def__new__(cls,name,bases,dct):print(f'Mymeta.__new__:cls={cls},id(cls)={id(cls)}')returnsuper().__new__(cls,name,bases,dct)def__init__(cls,name,bases,dct):print(f'Mymet......
  • Linux操作系统2-进程控制3(进程替换,exec相关函数和系统调用)
    上篇文章:Linux操作系统2-进程控制2(进程等待,waitpid系统调用,阻塞与非阻塞等待)-CSDN博客本篇代码Gitee仓库:Linux操作系统-进程的程序替换学习·d0f7bb4·橘子真甜/linux学习-Gitee.com本篇重点:进程替换目录一.什么是进程替换?二.进程替换函数常用的函数 2.1......
  • 类的析构函数自动调用
    类的析构函数会自动调用。析构函数是在对象的生命周期结束时由系统自动调用的特殊成员函数,主要用于释放对象占用的资源,执行清理工作。具体情况自动调用的时机:局部对象:当对象离开其作用域时,析构函数会自动调用。#include<iostream>classMyClass{public:~MyClass(......