項目做到一定階段,常常須要在原來的project上調用外部程序。
Qt為此提供了QProcess類,QProcess可用於完畢啟動外部程序,並與之交互通信。
基本用法:
QProcess p(0);
p.start("cmd", QStringList()<<"/c"<<"ping www.baidu.com");
p.waitForStarted();
p.waitForFinished();
QString strTemp=QString::fromLocal8Bit(p.readAllStandardOutput()); //獲得輸出
// QMessageBox testMassage;
// testMassage.setText(strTemp);
// testMassage.exec();
另一種用法:
QProcess p(0);
QString command = "E:/test_rar_course/rar.exe";
QStringList args;
args.append("a");
args.append("-k");
args.append("-r");
args.append("-s");
args.append("-m1");
args.append("E:/test_rar_course/test.rar");
args.append("E:/test_rar_course/direct1/");
args.append("E:/test_rar_course/direct2/");
args.append("E:/test_rar_course/test.txt");
p.execute(command,args);//command是要執行的命令,args是參數
p.waitForFinished();
qDebug()<<QString::fromLocal8Bit(p.readAllStandardError());
//p.start(command, args);
//p.waitForStarted();
//p.waitForFinished();
注:
QProcess::start() 接受兩個參數,第一個是要執行的命令或者程序,這里就是 notepad.exe;第二個是一個 QStringList 類型的數據,也就是需要傳遞給這個程序的運行參數。注意,這個程序是需要能夠由系統找到的,一般是完全路徑。
1-不帶空格。能夠啟動
process->start("F:/AppInst/115/115com/115com.exe");
2-帶空格,無法啟動
process->start("C:/Program Files/HaoZip/HaoZip.exe");
3-帶空格,使用帶參模式。能夠啟動
process->start("C:/Program Files/HaoZip/HaoZip.exe", QStringList("C:/Program Files/HaoZip/HaoZip.exe"));
一個完整的例子
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 中,我們通過 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 程序等待這個進程結束后再繼續執行的函數。