> 文章列表 > Qt 进程间交互(QProcess),一个简单例子查看D盘所有目录文件,实测可行。

Qt 进程间交互(QProcess),一个简单例子查看D盘所有目录文件,实测可行。

Qt 进程间交互(QProcess),一个简单例子查看D盘所有目录文件,实测可行。

Qt 进程间交互

  • Qt 进程间交互
    • mainwindow.h
    • mainwindow.cpp

Qt 进程间交互

进程间交互
所谓 IO 其实不过是与其他设备之间的数据交互。在 Linux 上这个概念或许会更加清楚一些。Linux 把所有设备都看作是一种文件,因此所有的 IO 都归结到对文件的数据交互。同样,与其他进程之间也存在着数据交互,这就是进程间交互。

为什么需要进程间交互呢?Qt 虽然是一个很庞大的库,但是也不能面面俱到。每个需求都提供一种解决方案是不现实的。比如操作系统提供了查看当前文件夹下所有文件的命令(Windows 下是 dir, Linux 下是 ls),那么 Qt 就可以通过调用这个命令获取其中的信息。当然这不是一个很恰当的例子,因为 Qt 同样提供了相同的操作。不过,如果你使用版本控制系统,比如 SVN,然后你希望通过 SVN 的版本号生成自己系统的 build number,那么就不得不调用 svn 命令获取当前仓库的版本号。这些操作都涉及到进程间交互。

Qt 使用 QProcess 类完成进程间交互。我们从例子开始看起。由于比较简单,大家顺手写下就好的啦!

QProcess process;
process.start("cmd /c dir D:\\\\");   //查看D盘目录所有文件
process.waitForFinished();           //阻塞等待完成
QTextCodec *gbk = QTextCodec::codecForName("GB18030");                //解决字符编码乱码
QString result = gbk->toUnicode(process.readAllStandardOutput());      //读取全部
QStringList list = result.split("\\r\\n");
for (int i=0;i<list.size();i++) {qDebug() << list.at(i);
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QProcess>
#include <QTextCodec>
#include <QMessageBox>
#include <iostream>
#include <QDebug>using namespace std;QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();
private slots:void on_pushButton_pressed();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}//槽
void MainWindow::on_pushButton_pressed()
{QProcess process;process.start("cmd /c dir D:\\\\");   //查看D盘目录所有文件process.waitForFinished();           //阻塞等待完成QTextCodec *gbk = QTextCodec::codecForName("GB18030");                //解决字符编码乱码QString result = gbk->toUnicode(process.readAllStandardOutput());      //读取全部QStringList list = result.split("\\r\\n");for (int i=0;i<list.size();i++) {qDebug() << list.at(i);}
}