所谓 IO 其实不过是与其他设备之间的数据交互。在 Linux 上这个概念或许会更加清楚一些。Linux 把所有设备都看作是一种文件,因此所有的 IO 都归结到对文件的数据交互。同样,与其他进程之间也存在着数据交互,这就是进程间交互。
为什么需要进程间交互呢?Qt 虽然是一个很庞大的库,但是也不能面面俱到。每个需求都提供一种解决方案是不现实的。比如操作系统提供了查看当前文件夹下所有文件的命令(Windows 下是 dir, Linux 下是 ls),那么 Qt 就可以通过调用这个命令获取其中的信息。当然这不是一个很恰当的例子,因为 Qt 同样提供了相同的操作。不过,如果你使用版本控制系统,比如 SVN,然后你希望通过 SVN 的版本号生成自己系统的 build number,那么就不得不调用 svn 命令获取当前仓库的版本号。这些操作都涉及到进程间交互。
Qt 使用 QProcess 类完成进程间交互。我们从例子开始看起。由于比较简单,所以没有把 main() 函数贴上来,大家顺手写下就好的啦!
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
class MainWindow : public QMainWindow
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void openProcess();
private:
QProcess *p;
所谓 IO 其实不过是与其他设备之间的数据交互。在 Linux 上这个概念或许会更加清楚一些。Linux 把所有设备都看作是一种文件,因此所有的 IO 都归结到对文件的数据交互。同样,与其他进程之间也存在着数据交互,这就是进程间交互。为什么需要进程间交互呢?Qt 虽然是一个很庞大的库,但是也不能面面俱到。每个需求都提供一种解决方案是不现实的。比如操作系统提供了查看当前文件夹下所有文件的命令(Win...
目录一、项目介绍二、项目基本配置三、UI界面设计四、主程序实现4.1 widget.h头文件4.2 widget.cpp源文件五、效果演示
一、项目介绍
利用
QProcess
类实现启动
进程
的功能进阶(以dos命令dir为例)。
二、项目基本配置
新建一个
Qt
案例,项目名称为“ProcessTest”,基类选择“QWidget”,点击选中创建UI界面复选框,完成项目创建。
三、UI界面设计
UI界面布局如下:
界面中只创建了1个控件,其名称和类型如下:
文章目录创建及启动SIGNAL&SLOTreadyRead()readyReadStandard
Output
()errorOccurred(
QProcess
::ProcessError)finished(int)CMD指令写入参考鸣谢
创建及启动
QString program = "cmd.exe";
mProcess = new
QProcess
;
//合并
输出
通道
mProcess->setProcessChannelMode(
QProcess
::Merg
网上有一篇与此类似的文章,而且网上大部分的文章基本上都是复制来复制去的,目前我看过的也就是俩DEMO了,而且都是缺斤少两的货(代码不全,复制过来也跑不起来)。。。
为此我专门自己花了几天(实则加起来也就几个小时)自己硬啃DEMO + 个人理解总算是把完整的DEMO给整出来了。
网上的DEMO这里引用一下:http://www.cnblogs.com/wkcagd/p/7732330.html
记录一个标准数据流Debug的过程。
Qt
的re
adA
ll()与re
adA
llStandard
Output
()能
读取
数据流,但不能实时
读取
,是一大段一大段的文本打印。这张图应该比较好解释,首先有一个项目文件封装成exe作为内核,Bat脚本文件会调用多个不同的exe完成一系列的内容,
Qt
开发界面与简单的业务处理。
Qt
调用脚本文件,其中bat和exe都有
输出
流。
Qt
中关于获取标准读的用法如下:
既然槽函数没法实时刷新,很有可能是readyReadStandard
Output
()信号没法出来。了解到 fflus
Qt
输入
输出
之
QProcess
Qt
提供了一个
QProcess
类用于启动外部程序并与之通信。这个类是异步工作的,而且在后台执行,这样用户界面就可以始终保持响应。启动一个新的
进程
的操作非常简单,只需要将待启动的程序名称和启动参数传递给start()函数即可。
QObject *parent;
QString program = "tar"
QStringList argument...
PROBLEN使用
Qt
Creator编写代码,打印的
输出
往往在自带的一个
输出
窗口中,而这个
输出
窗口中的输入是无法获取的。如利用
Qt
IDE 调出
控制台
并打印
输出
到
控制台
且从
控制台
获取输入呢?SOLUTION1、在pro文件中添加 CONFIG+= console
2、在最左侧选择项目(ctrl + 5)->构建运行 选择运行 将 Run in terminal选中。TESTMainWindow
VS使用习惯了,有时候转到
QT
creator上会有些不适应。由于工作需要,现在需要实现在
QT
中通过
控制台
获取输入
输出
,也就是在黑框框程序里面进行cin cout操作。下面是一些实现步骤
1、配置工作
配置.pro文件,在CONFIG 中添加 console,添加后注意进行“构建->执行qmake” 否则配置无效
CONFIG += c++11 console #使用
控制台
程序需要...
①需要一个控件类型,可以是QLabel、QPushButton、QWidget等
②需要一个QWigdet类型的界面地址,可以是this即当前主界面,或者ui->widget…等,即某个子界面
③需要一个控件名字,QString类型,即通过setObjectName设置的名字,当然也可以为空,为空则表示界面下①类型的所有控件
QList<QPushButt.
本例介绍如何使用
QProcess
启动
进程
并实时获取启动
进程
的标准
输出
后显示。
本例在
QT
的MainWindow 启动后会每个1秒在
控制台
打印ping的log,如下图所示
#include "mainwindow.h"
#include <QApplication>
#include <
QProcess
>
#include <QDebug>
int main(int argc, char *argv[]) {
QApplication a(argc
在
QT
中,可以使用
QProcess
类来创建子
进程
,并通过start()函数启动子
进程
。在启动子
进程
时,可以使用setProcessChannelMode()函数设置子
进程
的标准输入
输出
流的模式。默认情况下,子
进程
的标准输入
输出
流是关闭的,需要手动打开。
在子
进程
中,可以使用标准输入
输出
流来与父
进程
进行通信。当子
进程
向标准
输出
流写入数据时,父
进程
会触发readyReadStandard
Output
()信号;当子
进程
从标准输入流
读取
数据时,父
进程
会触发readyReadStandardInput()信号。
因此,可以在父
进程
中连接这两个信号,并在槽函数中处理子
进程
的输入
输出
数据。具体实现方式可以参考以下代码:
```cpp
QProcess
*process = new
QProcess
(this);
process->setProcessChannelMode(
QProcess
::SeparateChannels);
process->start("your_program.exe");
connect(process, &
QProcess
::readyReadStandard
Output
, this, [=]() {
QByteArray
output
= process->re
adA
llStandard
Output
();
// 处理子
进程
的
输出
数据
connect(process, &
QProcess
::readyReadStandardInput, this, [=]() {
// 向子
进程
的标准输入流写入数据
process->write("your_input_data");
注意,以上代码仅为示例,实际使用时需要根据具体情况进行修改。