使用QT的QProcess执行cmd命令【记录】

简介: 使用QT的QProcess执行cmd命令【记录】

由于工作需求,要使用QT执行cmd命令。鉴于网上的方法实现了适合自己的一种方法。

先放效果图


QProcess Class

可用于完成启动外部程序,并与之交互通信。

创建并启动

在 QProcess 中,输入通道分为标准错误通道和标准输出通道,对应的信号分别是 readyReadStandardError() 和 readyRead()。

可通过 setProcessChannelMode(QProcess::MergedChannels) 将标准错误通道合并至标准输出通道。

    process = new QProcess(this);
    process->setProcessChannelMode(QProcess::MergedChannels);
    ...
    process->start("cmd.exe");


Signal

readyRead() 将我们输入的指令显示到控制台窗口中。

readyReadStandardOutput()将 cmd 指令返回结果显示至控制台窗口中。

errorOccurred(QProcess::ProcessError)将 QProcess 发送的打印至控制台。

finished(int)当 QProcess 退出时,mProcess 回到 NotRunning 状态,并发出 finished() 信号。


源码

mainwindow.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


mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QShortcut>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    setWindowTitle("cmd text");
    ui->setupUi(this);
    ui->lineEdit->setText(tr("ping zhangmengmm.top"));
    ui->textEdit->setLineWrapMode(QTextEdit::NoWrap);
    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()
{
    if(process != Q_NULLPTR)
    {
        process->close();
        delete process;
        process = Q_NULLPTR;
    }
}
void MainWindow::write_cmd()
{
    /* 获得命令,\r\n代替键盘的Enter,没有则不会执行 */
    QString cmd = ui->lineEdit->text() + "\r\n";
    ui->lineEdit->clear();
    ui->lineEdit->setFocus();
    QByteArray qbarr = cmd.toLatin1();
    char *ch = qbarr.data();
    qint64 len = cmd.length();
    process->write(ch, len);
    /* 信息输出 */
    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;
}


mainwindow.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>750</width>
    <height>426</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <widget class="QSplitter" name="splitter_3">
    <property name="geometry">
     <rect>
      <x>31</x>
      <y>10</y>
      <width>681</width>
      <height>341</height>
     </rect>
    </property>
    <property name="orientation">
     <enum>Qt::Vertical</enum>
    </property>
    <widget class="QSplitter" name="splitter_2">
     <property name="orientation">
      <enum>Qt::Vertical</enum>
     </property>
     <widget class="QSplitter" name="splitter">
      <property name="orientation">
       <enum>Qt::Horizontal</enum>
      </property>
      <widget class="QPushButton" name="pushButton">
       <property name="text">
        <string>Clear</string>
       </property>
      </widget>
      <widget class="QLineEdit" name="lineEdit"/>
      <widget class="QPushButton" name="pushButton_Enter">
       <property name="text">
        <string>Enter</string>
       </property>
      </widget>
     </widget>
     <widget class="QTextEdit" name="textEdit"/>
    </widget>
    <widget class="QPushButton" name="pushButton_Clear">
     <property name="text">
      <string>Clear</string>
     </property>
    </widget>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>750</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QToolBar" name="mainToolBar">
   <attribute name="toolBarArea">
    <enum>TopToolBarArea</enum>
   </attribute>
   <attribute name="toolBarBreak">
    <bool>false</bool>
   </attribute>
  </widget>
  <widget class="QStatusBar" name="statusBar"/>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>
目录
相关文章
|
编解码 C++ Windows
QT软件开发: QProcess启动进程完成交互并获取输出
QT软件开发: QProcess启动进程完成交互并获取输出
2564 0
QT软件开发: QProcess启动进程完成交互并获取输出
|
7月前
|
监控 Linux iOS开发
经验大分享:Qt之QProcess
经验大分享:Qt之QProcess
166 0
《QT从基础到进阶·二十八》QProcess使用,从一个exe程序启动另一个exe程序
《QT从基础到进阶·二十八》QProcess使用,从一个exe程序启动另一个exe程序
403 0
Qt通过QProcess启动进程并传递命令行参数
Qt通过QProcess启动进程并传递命令行参数
776 0
|
Linux Python
linux qt 项目中QProcess调用命令行命令执行python脚本
linux qt 项目中QProcess调用命令行命令执行python脚本
linux qt 项目中QProcess调用命令行命令执行python脚本
Qt 独立运行时伴随CMD命令窗口
用Qt写了一个小软件,在把程序release后,打包分装后,发现程序运行的时候会伴随cmd命令窗口,可把我愁怀了 不过功夫不负有心人,在老师和我网友的帮助下,终于搞完了
602 0
Qt 独立运行时伴随CMD命令窗口
qt使用qmake命令把pro工程转vcxproj工程
qt使用qmake命令把pro工程转vcxproj工程
719 0
|
6月前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
208 1