
總第14篇
本文主要詳細總結了在Qt項目開發過程中,如何借助QProcess類快速實作外部程式調用,并在此基礎上說明了相關接口的用法。通過閱讀本文你将掌握程式程序間調用的方法,以便在以後的開發過程中可以參考。
1.QProcess類及接口介紹
QProcess類是Qt中專門用于啟動一個外部程式程序并與主程式通信的。此類中包含多個靜态函數和信号,可以友善地通過信号與槽機制實作資訊互通。
我們要實作快速調用外部程式,常用的有三個接口函數:
-
: 此函數是以阻塞的方式打開外部程式,隻有外部程式執行完成後,主程式才會繼續執行。外部程式的标準輸出、标準錯誤都是重定向到主程式的标準輸出和标準錯誤的。QProcess::execute()
-
: 此函數是以子程序的 方式打開外部程式的,外部程序與主程式互不幹擾,但外部程序的父程序就是主程式。QProcess::start()
-
: 此函數是以分離的方式打開外部程式的,外部程式與主程式互不幹擾,外部程序的父程序是系統的QProcess::startDetached()
程序。init
上面三個接口函數中,
execute()
和
startDetached()
為靜态成員函數,
start()
函數為普通成員函數。 另外,值得注意的是,使用
start()
函數打開外部程序時,外部程序啟動後,将随主程式的退出而退出,使用回調即可以正常接收資訊;使用
startDetached()
函數打開外部程序時,外部程序啟動後,不會随主程式的退出而退出,使用回調無法正常接收到資訊。
2. 打開外部程式的應用示例
對于日常工作中,想在某項工作執行完成後,執行關機操作。這就可以使用主程式調用作業系統中的
Shutdown.exe
程序。 這裡先介紹一下
Shutdown.exe
相關的操作指令參數,在
系統指令行
中可以直接運作此程序并檢視相關參數。
例如,我們要執行一小時後關機指令,可以寫如下代碼:
QStringList list;
list<< "-t" << "-s" << "3600";
QProcess::startDetached("Shutdown.exe",list);
// QProcess::execute("Shutdown.exe",list);
我們可以建立QProcess對象,使用
start()
函數,檢視外部程序傳回的資料,輸出結果。其代碼可以寫成如下形式:
QProcess *pProces = new QProcess(this);
connect(pProces, SIGNAL(readyRead()),this, SLOT(on_read()));
QStringList list;
pProces->start("Shutdown.exe", list);
void on_read()
{
QProcess *pProces = (QProcess *)sender();
QString result = pProces->readAll();
QMessageBox::warning(NULL, "", result);
}
也可以單獨執行程式,如
route
、
ipconfig
等。
QProcess p(0);
p.start("route");
p.waitForStarted();
p.waitForFinished();
qDebug()<<QString::fromLocal8Bit(p.readAllStandardError());
QProcess p(0);
p.start("ipconfig");
p.waitForStarted();
p.waitForFinished();
qDebug()<<QString::fromLocal8Bit(p.readAllStandardOutput());
也可以借助
write()
函數向外部程序中寫入相應的參數,示例如下:
QProcess p(0);
p.start("cmd");
p.waitForStarted();
p.write("dirn");
p.closeWriteChannel();
p.waitForFinished();
qDebug()<<QString::fromLocal8Bit(p.readAllStandardOutput());
//或者是這一種形式
QProcess p(0);
p.start("cmd", QStringList()<<"/c"<<"dir");
p.waitForStarted();
p.waitForFinished();
qDebug()<<QString::fromLocal8Bit(p.readAllStandardOutput());
我們也可以通過QProcess使用管道的功能,即一個程序的标準輸出流到目标程序的标準輸入流:
command1 | command2
。其代碼如下示例:
QProcess process1;
QProcess process2;
process1.setStandardOutputProcess(&process2); //注意設定
process1.start("command1");
process2.start("command2");
在項目開發過程中,要根據需求場景靈活選擇适宜的接口函數,以達到滿意的效果。
本文到此結束!
=======================================================
歡迎【
關注作者、私信作者】。我們一起交流一起進步。
=======================================================