linux环境下QT使用QProcess 关闭程序

文章介绍了在Qt环境下,如何使用QProcess在Windows上通过taskkill命令关闭程序,在Linux上使用kill命令终止进程。同时,展示了如何改进QProcess子类MyProcess,使其能实时捕获并输出程序的输出内容。通过主进程事件循环和输出缓冲区,实现了程序运行过程中的实时输出追踪。
摘要由CSDN通过智能技术生成

Windows关闭程序的方法:

在qt代码里有时需要qprocess调用第三方程序,调用完后需要终止。手动叉掉不合适。此时可以调用window下的taskkill程序关闭该程序

QProcess process;
process.execute("taskkill /im xx.exe /f");

linux关闭程序的方法

在Ubuntu中可以使用kill命令来终止进程。为了在Qt代码中使用kill命令,可以通过继承QProcess类来实现。
代码如下:

```
#include <QtCore>

class MyProcess : public QProcess {
public:
  void stopProcess() {
    if (state() != QProcess::NotRunning) {
      terminate(); // 发送SIGTERM信号
      waitForFinished(); // 等待进程终止
    }
  }
};

int main(int argc, char *argv[])
{
  QCoreApplication a(argc, argv);
  
  MyProcess process;
  process.start("your_program"); //调用需要终止的程序

  process.stopProcess(); //终止程序

  return a.exec();
}
```

这里使用了自定义的MyProcess类继承QProcess,并添加了stopProcess()方法来实现终止进程的功能。

stopProcess()方法会先发送SIGTERM信号终止进程,然后等待进程完全终止。如果不调用waitForFinished(),那么可能会导致进程没有完全终止就被关闭。

继续改进这个代码,在MyProcess类里面封装获得执行的console的程序的输出内容并切实时的qdebug出来显示。
寻找更优解,好的,我可以继续改进这个代码来封装获得执行的console的程序的输出内容并实时地QDebug出来显示。
修改后的代码如下:

```
#include <QtCore>

class MyProcess : public QProcess {
public:
    MyProcess() {
        connect(this, &QProcess::readyReadStandardOutput, [=](){
            QByteArray output = this->readAllStandardOutput();
            //QByteArray转QString并移除结尾的换行符
            QString text(output);
            text.chop(1);
            qDebug() << text;
        });
    }

    void stopProcess() {
        if (state() != QProcess::NotRunning) {
            terminate(); // 发送SIGTERM信号
            waitForFinished(); // 等待进程终止
        }
    }
};

int main(int argc, char *argv[])
{
  QCoreApplication a(argc, argv);
  
  MyProcess process;
  process.start("your_program"); //调用需要终止的程序

  process.waitForFinished(); //等待程序执行结束

  return a.exec();
}
```

在MyProcess类的构造函数中,我添加了一个连接到QProcess的`readyReadStandardOutput()`信号的lambda表达式,用于实时获取调用的程序输出的内容,并通过QDebug实时进行输出。

然后在程序中,我们调用process的waitForFinished()方法等待程序执行完毕即可。在程序运行过程中,MyProcess类会将获得的调用程序的输出内容输出到控制台。

注意:使用waitForFinished()方法会阻塞程序的运行,如果产生大量输出内容,程序可能会因为阻塞而无法响应。如果需要避免阻塞,可以使用QProcess的信号和槽来实现。

在这个例子qDebug() << text;的执行是在stopProcess()  process.waitForFinished();   等待程序执行结束 之后才打印出来的。有没有办法实时的输出执行的程序的实时输出信息?

这个问题是因为`qDebug() << text`在MyProcess类中的信号槽函数中是使用的异步操作,即当获得程序输出时会发送信号通知到主线程输出,在主线程中有可能还在等待程序执行完毕,因此需要等到程序执行完毕后才输出。

为了实现实时输出执行程序的输出信息,我们需要将`qDebug() << text`的输出移到主进程中来执行。具体实现可以通过在主进程中建立一个循环来实时读取MyProcess类中存储的输出缓存,并将其输出到控制台上。
代码如下:

```
#include <QtCore>

class MyProcess : public QProcess {
public:
    MyProcess() {
        connect(this, &QProcess::readyReadStandardOutput, [=](){
            QByteArray output = this->readAllStandardOutput();
            //QByteArray转QString并移除结尾的换行符
            QString text(output);
            text.chop(1);
            outputBuffer.append(text);
        });
    }

    void stopProcess() {
        if (state() != QProcess::NotRunning) {
            terminate(); // 发送SIGTERM信号
            waitForFinished(); // 等待进程终止
            qDebug() << outputBuffer; // 输出存储的输出缓存
        }
    }

protected:
    QString outputBuffer;
};

int main(int argc, char *argv[])
{
  QCoreApplication a(argc, argv);

  MyProcess process;
  process.start("your_program"); //调用需要终止的程序

  while(process.state() != QProcess::NotRunning){
      a.processEvents(); //触发主进程事件循环,处理传入的事件
      QByteArray output = process.readAllStandardOutput();
      if(!output.isEmpty()){
          QString text(output); 
          text.chop(1);
          qDebug() << text; //实时输出程序的输出内容
      }
  }

  process.stopProcess(); //终止程序

  return a.exec();
}
```

在这个修改后的代码中,我们添加了一个`outputBuffer`成员变量,用于存储程序的输出缓存。在MyProcess类的`readyReadStandardOutput()`信号槽函数中,将获得的程序输出存储到输出缓存之中。

主进程中,我们使用一个while循环来不断处理事件,并检查是否存在程序输出。
如果程序有输出,我们将其实时输出,否则等待程序执行结束后,再次通过调用`stopProcess()`方法来输出程序的输出缓存。

这样一来,我们就可以实时追踪处理程序的输出内容了。《但是最终并没有实现看到这个实施现象。
            
 

Qt中,可以使用QProcess类来执行外部程序。要强制杀死一个进程,可以使用taskkill命令在Windows系统中,或者使用kill命令在Ubuntu系统中。以下是使用QProcess类在Qt中实现强制杀死进程的代码示例: 在Windows系统中,可以使用taskkill命令来强制杀死进程。以下是使用QProcess类在Qt中执行taskkill命令的示例代码: QProcess process; process.execute("taskkill /im xx.exe /f"); 在Ubuntu系统中,可以使用kill命令来强制杀死进程。为了在Qt代码中使用kill命令,可以通过继承QProcess类来实现。以下是在Qt使用QProcess类执行kill命令的示例代码: ```cpp class MyProcess : public QProcess { public: void killProcess(const QString& processName) { QStringList arguments; arguments << "-9" << processName; start("kill", arguments); waitForFinished(); } }; // 使用自定义的MyProcess类来强制杀死进程 MyProcess process; process.killProcess("xx"); ``` 以上代码示例演示了如何在Qt使用QProcess类来执行taskkill命令(Windows系统)或kill命令(Ubuntu系统)来强制杀死进程。希望对您有帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [linux环境QT使用QProcess 关闭程序](https://blog.csdn.net/thanklife/article/details/131105862)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

零点零一

您的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值