鍍金池/ 教程/ C/ 進程間交互
Qt 容器和算法拾遺
自定義 model 之一
反走樣
Hello, world!
Qt 容器類之關(guān)聯(lián)存儲容器
QStringListModel
拖放技術(shù)之一
狀態(tài)欄
QTreeWidget
拖放技術(shù)之二
通用算法
event()
Qt 學(xué)習(xí)之路(18): Qt 標(biāo)準(zhǔn)對話框之 QInputDialog
Qt 容器類之遍歷器和隱式數(shù)據(jù)共享
QListWidget
Meta-Object 系統(tǒng)
事件接收與忽略
Qt 學(xué)習(xí)之路(tip): parent 參數(shù)
Qt 標(biāo)準(zhǔn)對話框之 QColorDialog
QPainter(續(xù))
國際化(下)
漸變填充
自定義委托
創(chuàng)建 shared library
model-view 架構(gòu)
Graphics View Framework
自定義拖放數(shù)據(jù)對象
QSortFilterProxyModel
國際化(上)
組件布局
自定義 Model 之三
事件過濾器
QDirModel
Hello, world!(續(xù))
Qt 標(biāo)準(zhǔn)對話框之 QFileDialog
自定義 model 之二
深入了解信號槽
坐標(biāo)變換
剪貼板操作
QTableWidget
QByteArray 和 QVariant
創(chuàng)建一個對話框(下)
Qt 學(xué)習(xí)之路(32): 一個簡易畫板的實現(xiàn)(Graphics View)
文本文件讀寫
自定義事件
編寫跨平臺的程序
MainWindow
初探信號槽
Qt 學(xué)習(xí)之路(17): Qt 標(biāo)準(zhǔn)對話框之 QMessageBox
繪圖設(shè)備
菜單和工具條(續(xù))
二進制文件讀寫
QString
事件(event)
菜單和工具條
QPainter
Qt 容器類之順序存儲容器
進程間交互
API 文檔的使用
創(chuàng)建一個對話框(上)
一個簡易畫板的實現(xiàn)(QWidget)

進程間交互

所謂 IO 其實不過是與其他設(shè)備之間的數(shù)據(jù)交互。在 Linux 上這個概念或許會更加清楚一些。Linux 把所有設(shè)備都看作是一種文件,因此所有的 IO 都?xì)w結(jié)到對文件的數(shù)據(jù)交互。同樣,與其他進程之間也存在著數(shù)據(jù)交互,這就是進程間交互。

為什么需要進程間交互呢?Qt 雖然是一個很龐大的庫,但是也不能面面俱到。每個需求都提供一種解決方案是不現(xiàn)實的。比如操作系統(tǒng)提供了查看當(dāng)前文件夾下所有文件的命令(Windows 下是 dir, Linux 下是 ls),那么 Qt 就可以通過調(diào)用這個命令獲取其中的信息。當(dāng)然這不是一個很恰當(dāng)?shù)睦?,因?Qt 同樣提供了相同的操作。不過,如果你使用版本控制系統(tǒng),比如 SVN,然后你希望通過 SVN 的版本號生成自己系統(tǒng)的 build number,那么就不得不調(diào)用 svn 命令獲取當(dāng)前倉庫的版本號。這些操作都涉及到進程間交互。

Qt 使用 QProcess 類完成進程間交互。我們從例子開始看起。由于比較簡單,所以沒有把 main() 函數(shù)貼上來,大家順手寫下就好的啦!

mainwindow.h


#ifndef MAINWINDOW_H  
#define MAINWINDOW_H  

#include <QtGui>  

class MainWindow : public QMainWindow  
{  
    Q_OBJECT  

public:  
    MainWindow(QWidget *parent = 0);  
    ~MainWindow();  

private slots:  
    void openProcess();  

private:  
    QProcess *p;  
};  

#endif // MAINWINDOW_H 

mainwindow.cpp


#include "mainwindow.h"  

MainWindow::MainWindow(QWidget *parent)  
    : QMainWindow(parent)  
{  
    p = new QProcess(this);  
    QPushButton *bt = new QPushButton("execute notepad", this);  
    connect(bt, SIGNAL(clicked()), this, SLOT(openProcess()));  
}  

MainWindow::~MainWindow()  
{  

}  

void MainWindow::openProcess()  
{  
    p->start("notepad.exe");  
} 

這個窗口很簡單,只有一個按鈕,當(dāng)你點擊按鈕之后,程序會調(diào)用 Windows 的記事本。這里我們使用的是


p->start("notepad.exe");

語句。QProcess::start() 接受兩個參數(shù),第一個是要執(zhí)行的命令或者程序,這里就是 notepad.exe;第二個是一個 QStringList 類型的數(shù)據(jù),也就是需要傳遞給這個程序的運行參數(shù)。注意,這個程序是需要能夠由系統(tǒng)找到的,一般是完全路徑。但是這里為什么只有 notepad.exe 呢?因為這個程序?qū)嶋H是放置在 Windows 系統(tǒng)文件夾下,是已經(jīng)添加到了系統(tǒng)路徑之中,因此不需要再添加本身的路徑。

下面我們再看一個更復(fù)雜的例子,調(diào)用一個系統(tǒng)命令,這里我使用的是 Windows,因此需要調(diào)用 dir;如果你是在 Linux 進行編譯,就需要改成 ls 了。

mainwindow.h


#ifndef MAINWINDOW_H  
#define MAINWINDOW_H  

#include <QtGui>  

class MainWindow : public QMainWindow  
{  
    Q_OBJECT  

public:  
    MainWindow(QWidget *parent = 0);  
    ~MainWindow();  

private slots:  
    void openProcess();  
    void readResult(int exitCode);  

private:  
    QProcess *p;  
};  

#endif // MAINWINDOW_H 

mainwindow.cpp


#include "mainwindow.h"  

MainWindow::MainWindow(QWidget *parent)  
    : QMainWindow(parent)  
{  
    p = new QProcess(this);  
    QPushButton *bt = new QPushButton("execute notepad", this);  
    connect(bt, SIGNAL(clicked()), this, SLOT(openProcess()));  
}  

MainWindow::~MainWindow()  
{  

}  

void MainWindow::openProcess()  
{  
    p->start("cmd.exe", QStringList() << "/c" << "dir");  
    connect(p, SIGNAL(finished(int)), this, SLOT(readResult(int)));  
}  

void MainWindow::readResult(int exitCode)  
{  
    if(exitCode == 0) {  
        QTextCodec* gbkCodec = QTextCodec::codecForName("GBK");  
        QString result = gbkCodec->toUnicode(p->readAll());  
        QMessageBox::information(this, "dir", result);  
    }  
} 

我們僅增加了一個 slot 函數(shù)。在按鈕點擊的 slot 中,我們通過 QProcess::start() 函數(shù)運行了指令 cmd.exe /c dir 這里是說,打開系統(tǒng)的 cmd 程序,然后運行 dir 指令。如果有對參數(shù) /c 有疑問,只好去查閱 Windows 的相關(guān)手冊了哦,這已經(jīng)不是 Qt 的問題了。然后我們 process 的 finished() 信號連接到新增加的 slot 上面。這個 signal 有一個參數(shù) int。我們知道,對于 C/C++ 程序而言,main() 函數(shù)總是返回一個 int,也就是退出代碼,用于指示程序是否正常退出。這里的 int 參數(shù)就是這個退出代碼。在 slot 中,我們檢查退出代碼是否是0,一般而言,如果退出代碼為0,說明是正常退出。然后把結(jié)果顯示在 QMessageBox 中。怎么做到的呢?原來,QProcess::readAll() 函數(shù)可以讀出程序輸出內(nèi)容。我們使用這個函數(shù)將所有的輸出獲取之后,由于它的返回結(jié)果是 QByteArray 類型,所以再轉(zhuǎn)換成 QString 顯示出來。另外注意一點,中文本 Windows 使用的是 GBK 編碼,而 Qt 使用的是 Unicode 編碼,因此需要做一下轉(zhuǎn)換,否則是會出現(xiàn)亂碼的,大家可以嘗試一下。

好了,進程間交互就說這么說,通過查看文檔你可以找到如何用 QProcess 實現(xiàn)進程過程的監(jiān)聽,或者是令Qt 程序等待這個進程結(jié)束后再繼續(xù)執(zhí)行的函數(shù)。

本文出自 “豆子空間” 博客,請務(wù)必保留此出處 http://devbean.blog.51cto.com/448512/193918

上一篇:自定義 model 之一下一篇:通用算法