版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://devbean.blog.51cto.com/448512/305116
所谓 IO 其实不过是与其他设备之间的数据交互。在 Linux 上这个概念或许会更加清楚一些。Linux 把所有设备都看作是一种文件,因此所有的 IO 都归结到对文件的数据交互。同样,与其他进程之间也存在着数据交互,这就是进程间交互。
为什么需要进程间交互呢?Qt 虽然是一个很庞大的库,但是也不能面面俱到。每个需求都提供一种解决方案是不现实的。比如操作系统提供了查看当前文件夹下所有文件的命令(Windows 下是 dir, Linux 下是 ls),那么 Qt 就可以通过调用这个命令获取其中的信息。当然这不是一个很恰当的例子,因为 Qt 同样提供了相同的操作。不过,如果你使用版本控制系统,比如 SVN,然后你希望通过 SVN 的版本号生成自己系统的 build number,那么就不得不调用 svn 命令获取当前仓库的版本号。这些操作都涉及到进程间交互。
Qt 使用 QProcess 类完成进程间交互。我们从例子开始看起。由于比较简单,所以没有把 main() 函数贴上来,大家顺手写下就好的啦!
mainwindow.h
1. #ifndef MAINWINDOW_H
2. #define MAINWINDOW_H
3.
4. #include <QtGui>
5.
6. class MainWindow : public QMainWindow
7. {
8. Q_OBJECT
9.
10. public:
11. MainWindow(QWidget *parent = 0);
12. ~MainWindow();
13.
14. private slots:
15. void openProcess();
16.
17. private:
18. QProcess *p;
19. };
20.
21. #endif // MAINWINDOW_H
mainwindow.cpp
1. #include "mainwindow.h"
2.
3. MainWindow::MainWindow(QWidget *parent)
4. : QMainWindow(parent)
5. {
6. p = new QProcess(this);
7. QPushButton *bt = new QPushButton("execute notepad", this);
8. connect(bt, SIGNAL(clicked()), this, SLOT(openProcess()));
9. }
10.
11. MainWindow::~MainWindow()
12. {
13.
14. }
15.
16. void MainWindow::openProcess()
17. {
18. p->start("notepad.exe");
19. }
这个窗口很简单,只有一个按钮,当你点击按钮之后,程序会调用 Windows 的记事本。这里我们使用的是
1. p->start("notepad.exe");
语句。QProcess::start() 接受两个参数,第一个是要执行的命令或者程序,这里就是 notepad.exe;第二个是一个 QStringList 类型的数据,也就是需要传递给这个程序的运行参数。注意,这个程序是需要能够由系统找到的,一般是完全路径。但是这里为什么只有 notepad.exe 呢?因为这个程序实际是放置在 Windows 系统文件夹下,是已经添加到了系统路径之中,因此不需要再添加本身的路径。
下面我们再看一个更复杂的例子,调用一个系统命令,这里我使用的是 Windows,因此需要调用 dir;如果你是在 Linux 进行编译,就需要改成 ls 了。
mainwindow.h
1. #ifndef MAINWINDOW_H
2. #define MAINWINDOW_H
3.
4. #include <QtGui>
5.
6. class MainWindow : public QMainWindow
7. {
8. Q_OBJECT
9.
10. public:
11. MainWindow(QWidget *parent = 0);
12. ~MainWindow();
13.
14. private slots:
15. void openProcess();
16. void readResult(int exitCode);
17.
18. private:
19. QProcess *p;
20. };
21.
22. #endif // MAINWINDOW_H
mainwindow.cpp
1. #include "mainwindow.h"
2.
3. MainWindow::MainWindow(QWidget *parent)
4. : QMainWindow(parent)
5. {
6. p = new QProcess(this);
7. QPushButton *bt = new QPushButton("execute notepad", this);
8. connect(bt, SIGNAL(clicked()), this, SLOT(openProcess()));
9. }
10.
11. MainWindow::~MainWindow()
12. {
13.
14. }
15.
16. void MainWindow::openProcess()
17. {
18. p->start("cmd.exe", QStringList() << "/c" << "dir");
19. connect(p, SIGNAL(finished(int)), this, SLOT(readResult(int)));
20. }
21.
22. void MainWindow::readResult(int exitCode)
23. {
24. if(exitCode == 0) {
25. QTextCodec* gbkCodec = QTextCodec::codecForName("GBK");
26. QString result = gbkCodec->toUnicode(p->readAll());
27. QMessageBox::information(this, "dir", result);
28. }
29. }
我们仅增加了一个 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
分享到:
相关推荐
现代OpenGL+Qt学习笔记之二:程序框架http://blog.csdn.net/chaojiwudixiaofeixia/article/details/77917697源码。
Qt学习之路,作者写的很好,一个一个问题的讲解,便于理解。
Qt进程间通信与同步示例,通过QFile内存映射文件来共享内存达到进程间通信的效果。同时利用QSystemSemaphore 来实现进程同步
进程是操作系统的基础之一。一个进程可以认为是一个正在执行的程序。我们可以把进程当做计算机运行时的一个基础单位。关于进程的讨论已经超出了本章的范畴,现在我们假定你是了解这个概念的。 在 Qt 中,我们使用...
现代OpenGL+Qt学习笔记之三:显示一个彩色三角形http://blog.csdn.net/chaojiwudixiaofeixia/article/details/77927876源码。
使用现代OpenGL+Qt实现的模拟聚光灯的效果。详见博文现代OpenGL+Qt学习笔记之十二:模拟聚光灯http://blog.csdn.net/chaojiwudixiaofeixia/article/details/78220271
现代OpenGL+Qt学习笔记之四:使用Uniform变量实现对模型的旋转http://blog.csdn.net/chaojiwudixiaofeixia/article/details/77944140源码
Qt学习之路(更新版),豆子空间经典的QT学习中文入门版本,现在出了更新版本,基于Qt 4.6
整理自豆子大佬博客 https://www.devbean.net/category/qt-study-road-2/ 前人最多整理到了79,我将后续的80-94整理进去了,现在更新到了16年的94章
Qt Remote Object简称QtRO,这是Qt5.9以后官方推出来的新模块,专门用于进程间通信(IPC)。在这之前,要实现进程间通信有多种方式,这里就不做介绍了,而Qt官方推出的这个新模块是基于Socket来封装的,使用起来非常...
1、新手上路,官方教程 2、qt学习之路1-18 3、进阶学习 4、深入理解qt
非常好的QT 学习资粮 目录分明易懂 DZY 非常好的QT 学习资粮 目录分明易懂 DZY
Qt 学习之路2.pdf
Qt学习之路 很好的入门教程,适合初学Qt的人,全部包含
Qt共享内存实现进程间通信(QSharedMemory) 源代码
Qt 学习之路(1) 前言 我们所使用的Qt,确切地说也就是它的GUI编程部分。C++的GUI编程同Java不同:GUI并不是C++标准的一部分。所以,如果使用 Java,那么你最好的选择就是AWT/Swing,或者也可以使SWT/JFace,但是,...
本资源为本人学习Qt时手码,主要参考学习网络博客《Qt学习之路2》,源码对应,入门学习Qt的同学可以参考~欢迎交流
原载于豆子博客的《Qt学习之路》离线PDF版本。---整理:DZY 全书60章节,P247,基于Qt4编写,适合新手入门,具有参考价值。
70. 进程间通信 71. 线程简介 72. 线程和事件循环 73. Qt 线程相关类 74. 线程和 QObject 75. 线程总结 76. QML 和 QtQuick 2 77. QML 语法 78. QML 基本元素 79. QML 组件 80. 定位器 81. 元素布局 82. 输入元素 ...
一个例子:通过Windows窗口消息实现 QT进程间通信,实现消息在进程间互发