调用一个系统命令,并读取它的输出值(使用QProcess.readAll)

下面我们再看一个更复杂的例子,调用一个系统命令,这里我使用的是 Windows,因此需要调用 dir;如果你是在 Linux 进行编译,就需要改成 ls 了。

mainwindow.h

  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QtGui>
  4. class MainWindow : public QMainWindow
  5. {
  6. Q_OBJECT
  7. public:
  8. MainWindow(QWidget *parent = 0);
  9. ~MainWindow();
  10. private slots:
  11. void openProcess();
  12. void readResult(int exitCode);
  13. private:
  14. QProcess *p;
  15. };
  16. #endif // MAINWINDOW_H

mainwindow.cpp

  1. #include "mainwindow.h"
  2. MainWindow::MainWindow(QWidget *parent)
  3. : QMainWindow(parent)
  4. {
  5. p = new QProcess(this);
  6. QPushButton *bt = new QPushButton("execute notepad", this);
  7. connect(bt, SIGNAL(clicked()), this, SLOT(openProcess()));
  8. }
  9. MainWindow::~MainWindow()
  10. {
  11. }
  12. void MainWindow::openProcess()
  13. {
  14. p->start("cmd.exe", QStringList() << "/c" << "dir");
  15. connect(p, SIGNAL(finished(int)), this, SLOT(readResult(int)));
  16. }
  17. void MainWindow::readResult(int exitCode)
  18. {
  19. if(exitCode == 0) {
  20. QTextCodec* gbkCodec = QTextCodec::codecForName("GBK");
  21. QString result = gbkCodec->toUnicode(p->readAll());
  22. QMessageBox::information(this, "dir", result);
  23. }
  24. }

我们仅增加了一个 slot 函数。在按钮点击的 slot 中,我们通过 QProcess::start() 函数运行了指令

cmd.exe /c dir

这里是说,打开系统的 cmd 程序,然后运行 dir 指令。如果有对参数 /c 有疑问,只好去查阅 Windows 的相关手册了哦,这已经不是 Qt 的问题了。然后我们 process 的 finished() 信号连接到新增加的 slot 上面。这个 signal 有一个参数 int。我们知道,对于 C/C++ 程序而言,main() 函数总是返回一个 int,也就是退出代码,用于指示程序是否正常退出。这里的 int 参数就是这个退出代码。在 slot 中,我们检查退出代码是否是0,一般而言,如果退出代码为0,说明是正常退出。然后把结果显示在 QMessageBox 中。怎么做到的呢?原来,QProcess::readAll() 函数可以读出程序输出内容。我们使用这个函数将所有的输出获取之后,由于它的返回结果是 QByteArray 类型,所以再转换成 QString 显示出来。另外注意一点,中文本 Windows 使用的是 GBK 编码,而 Qt 使用的是 Unicode 编码,因此需要做一下转换,否则是会出现乱码的,大家可以尝试一下。

好了,进程间交互就说这么说,通过查看文档你可以找到如何用 QProcess 实现进程过程的监听,或者是令Qt 程序等待这个进程结束后再继续执行的函数。

本文出自 “豆子空间” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/305116

时间: 2024-12-17 01:53:49

调用一个系统命令,并读取它的输出值(使用QProcess.readAll)的相关文章

读取xml节点值生成一个实体类,读取xml所有节点值,读取所有xml所有节点名称

public partial class WebFormClassByEntity : System.Web.UI.Page    {        List<string> list = new List<string>();//存放所有节点名称        protected void Page_Load(object sender, EventArgs e)        {            //读取xml的文件路径            string filePah

Python调用外部系统命令

利用Python调用外部系统命令的方法可以提高编码效率.调用外部系统命令完成后可以通过获取命令执行返回结果码.执行的输出结果进行进一步的处理.本文主要描述Python常见的调用外部系统命令的方法,包括os.system().os.popen().subprocess.Popen()等. 1.subprocess模块 优先介绍subprocess模块的是由于该模块可以替代旧模块的方法,如os.system().os.popen()等,推荐使用.subporcess模块可以调用外部系统命令来创建新子

Qt学习之路(58): 进程间交互(QProcess.readAllStandardOutput可以读取控制台的输出)

所谓 IO 其实不过是与其他设备之间的数据交互.在 Linux 上这个概念或许会更加清楚一些.Linux 把所有设备都看作是一种文件,因此所有的 IO 都归结到对文件的数据交互.同样,与其他进程之间也存在着数据交互,这就是进程间交互. 为什么需要进程间交互呢?Qt 虽然是一个很庞大的库,但是也不能面面俱到.每个需求都提供一种解决方案是不现实的.比如操作系统提供了查看当前文件夹下所有文件的命令(Windows 下是 dir, Linux 下是 ls),那么 Qt 就可以通过调用这个命令获取其中的信

深层剖析pr输出值

基本内容 PR输出值定义:带给友情链接网站的PR值. 计算公式:(1 - 0.85) + 0.85 * (PR值 / 外链数) 这里把上面公式中的0.85就当成是1,则公式就可以简化为:PR输出值=PR值 / 外链数,从简化公式不难看出,当网站PR一定,外链数越多,则输出PR值则越小. PR输出值的作用:即你链接上别人的网站,你网站就会分给对方0.29的PR值. 对本身网站的PR是没有影响的.对别人的网站的PR值提升有一定的帮助,所以现在出现很多是出售自己网站的友情链接赚钱.7B链接交易平台就是

使用jQuery匹配文档中所有的li元素,返回一个jQuery对象,然后通过数组下标的方式读取jQuery集合中第1个DOM元素,此时返回的是DOM对象,然后调用DOM属性innerHTML,读取该元素 包含的文本信息

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"><head> <meta htt

C++构造函数的自动调用(调用一个父类的构造函数,有显性调用最好,否则就默认调用无参数的构造函数)——哲学思想:不调用怎么初始化父类的成员数据和VMT?

我总是记不住构造函数的特点,关键还是没有领会那个哲学思想:父类的构造函数一方面要初始化它自己的成员数据,另一方面也要建立它自己的VMT呀!心里默念一百遍:一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VMT,一定调用父类构造函数VM

app调用webapi时候出现读取不到session的问题

今天在测试公司的app的时候发现了这样一个问题,在app调用webapi的时候读取不到session,在网上查了一下果然有类似的问题,果断记录下来. 需求: 1.app在修改密码的时候有一个获取验证码的过程,我们将这个验证码信息记录到了session中. 2.app在获取完验证码后需要一个验证当前验证码信息及用户信息,问题就出现在验证码校验的过程,此时的session是获取不到信息的. 分析问题原因:app在请求api的时候缺少sessionid而导致session不知道从哪个session盒子

设置并调用一个项目库(is Library)

什么是项目库 项目中要集成其他项目,由于集成项目庞大不想机械的copy,就想将集成的项目做成项目库.这样以后集成项目升级,项目里面升级也方便. 需要注意的事项 1.工作项目和库项目的资源名称,如果名称重复,编译器会优先使用工作项目(也称为子项目)的资源. 2.无法将一个项目库导出为一个jar文件. 3.项目库的android系统版本必须低于或等于工作项目的系统. 4.每一个库项目都会生成一个R文件,工作项目被编译时,将会合并工作项目和项目库的R文件,如果R文件中的敞亮名称同名,将使用工作项目R文

面试题之java 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 要求不能出现截半的情况

题目:10. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串. 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”. 一.需要分析 1.输入为一个字符串和字节数,输出为按字节截取的字符串-------------->按照字节[byte]截取操作字符串,先将String转换成byte类型 .2.汉字不可以截半----------------------------------