QT輸入輸出(四)之 QProcess

QProcess

Qt提供了一個QProcess類用于啟動外部程序并與之通信.這個類是異步工作的,而且在后臺執行,這樣用戶界面就可以始終保持響應。

?啟動一個新的進程的操作非常簡單,只需要將待啟動的程序名稱和啟動參數傳遞給start()函數即可.

例如:

 QObject *parent;QString program = "tar" QStringList arguments;arguments << "czvf" << "backup.tar.gz" << "/home";QProcess *myProcess = new QProcess(parent);QProcess->start(program, arguments);

(1)當調用start()函數后,myProcess進程立即進入啟動狀態,但tar程序尚未被調用,不能讀寫標準輸入輸出設備.

(2)當進程完成啟動后就進入"運行狀態"并向外發出started()信號.在輸入輸出方面,QProcess將一個進程看做一個流類型的I/O設備,可以像使用QTcpSocket讀寫流類型的網絡連接一樣來讀寫一個進程.可以通過QIODevice::write()函數向所啟動進程的標準輸入寫數據,也可以通過QIODevice::readAll()、QIODevice::readLine()和QIODevice::getChar()函數從這個進程的標準輸出讀數據.此外由于QProcess是從QIODevice類繼承而來的,因此,它也可以作為QXmlReader

的數據在源,或者為QFtp產生上傳數據.

(3)最后,當進程退出時QProcess進入起始狀態----"非運行狀態",并發出finished()信號.

???void finished(int exitCode, QProcess::ExitStatus exitStatus)信號在參數中返回了進程退出的退出碼和退出狀態,可以調用exitCode()函數和exitStatus()函數分別獲取最后退出進程的這兩個值.其中,Qt定義的進程"退出狀態"只有正常退出和進程崩潰兩種,分別對應值QProcess::NormalExit(值0)和QProcess::CrashExit(值1).當進程在運

行中產生錯誤時,QProcess將發出error()信號,可以通過,調用error()函數返回最后一次產生錯誤的類型,并通過,state()找出此時進程所處的狀態.

?

Qt定義了如下的進程錯誤代碼:

----------------------------------------------------------------

錯誤常量 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?值????? 描述

QProcess::FailedToStart??????? 0??????進程啟動失敗

QProcess::Crashed ? ? ? ? ? ? ? 1?????? 進程成功啟動后崩潰

QProcess::Timedout ? ? ? ? ? ? ?2?????? 最后一次調用waitFor...()函數超時.此時QProcess狀態不變,并可以再次調用waitFor()類型的函數

QProcess::WriteError ? ? ? ? ? ? 3?????? 向進程寫入時出錯.如進程尚未啟動,或者輸入通道被關閉時

QProcess::ReadError ? ? ? ? ? ? 4?????? 從進程中讀取數據時出錯.如進程尚未啟動時

QProcess::UnknownError ? ? ?5??????未知錯誤.這也是error()函數返回的默認值

?

進程的標準輸出:

stdout:通常用于控制臺下輸出

stderr:通常用于進程打印錯誤

它們本質上是兩個獨立的數據流.

可以通過調用setReadChanned()函數設置當前的讀通道

當有可讀數據時Qt將發發出readyRead()信號

如果是標準輸出和標準錯誤通道中讀取數據,還會發出readyReadStandardOutput()信號

如果是標準錯誤也會發出readyReadStandardError()信號

readAllStandardOutput()函數從標準輸出通道中讀取數據

readAllStandardErrot()函數從標準錯誤通道中讀取數據

在進程啟動以前以MergedChannels參數調用setReadChannelMode()函數可以把標準輸出通道和標準輸錯誤通道合并

例如:

#include <QApplication>
#include <QProcess>
#include <QString>
#include <iostream>int main(int argc, char *argv[])
{QApplication app(argc, argv);QProcess proc;QStringList arguments;arguments << "-na";proc.start("netstat", arguments);// 等待進程啟動if (!proc.waitForStarted()){std::cout << "啟動失敗\n";return false;}// 關閉寫通道,因為沒有向進程寫數據,沒用到 proc.closeWriteChannel();// 用于保存進程的控制臺輸出QByteArray procOutput;// 等待進程結束while (false == proc.waitForFinished()){;}// 讀取進程輸出到控制臺的數據procOutput = proc.readAll();// 輸出讀到的數據std::cout << procOutput.data() << std::endl;// 返回return EXIT_SUCCESS;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458612.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458612.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458612.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iOS 推送 邏輯

推送 階段一&#xff1a;Provider[服務端]把要發送的消息&#xff0c;目的IOS設備標識打包&#xff0c;發送給APNS&#xff1b; 階段二&#xff1a;APNS在自身的已注冊Push服務的IOS設備列表中&#xff0c;查找有相應標識的IOS設備&#xff0c;并將消息發送到IOS設備&#xff1…

正則提取的url中的域名以及替換域名的方法 preg_match()和preg_replace()

<?php //網站的url$url http://www.baidu.com/index.php;//正則表達式$reg /(http):\/\/([^\/])/i;preg_match($reg, $url,$res);/** $res的結果array (size3)0 > string http://www.baidu.com (length20)1 > string http (length4)2 > string www.baidu.com (…

音視頻開發

command s 截模擬器的屏幕 MP.4只是一個容器 H.264 H.263是真正的格式 H.265正在測試中 avi H.264 H.263 視頻解碼&#xff1a;將H.263 H.264轉換為視頻和音頻的格式 視頻編碼&#xff1a; 解碼&#xff1a;硬解碼&#xff1a;GPU做的解碼 CPU做除了圖片以外的&#…

10.11 安裝pod

原文地址&#xff1a;http://www.jianshu.com/p/5fc15906c53a 感謝。 更新升級10.11 cocoapods安裝出問題最簡單的解決方法 這是因為10.11把cocoapods直接干掉了 sudo gem install -n /usr/local/bin cocoapods 再加一句&#xff0c;完美解決 sudo xcode-select --switch /App…

windows任務管理器中的工作設置內存,內存專用工作集,提交大小詳解

通俗的講工作設置內存是程序占用的物理內存(包含與其他程序共享的一部分), 內存專用工作集是程序獨占的物理內存, 提交大小是程序獨占的內存(包含物理內存和在頁面文件中的內存). 注:頁面文件就是存放不在物理內存中的內存,文件路徑一般在C:\pagefile.sys,目的是為了能夠讓更…

coreData mapView #include

一、coreData 需要導入系統庫CoreData 新建文件的時候選core data 中的Data Model 然后加相應的表 加完表后 在Model.xcdatamodeld中新建文件 選coredata中的第三個 即可 如果兩個表有聯系 就將附表放到主表中 在build Setting中&#xff0c;輸入search 在Framework Searc…

淺談 C++ 中的 new/delete 和 new[]/delete[]

來自&#xff1a;http://www.cnblogs.com/hazir/p/new_and_delete.html 在 C 中&#xff0c;你也許經常使用 new 和 delete 來動態申請和釋放內存&#xff0c;但你可曾想過以下問題呢&#xff1f; new 和 delete 是函數嗎&#xff1f;new [] 和 delete [] 又是什么&#xff1f…

JavaScript中的原型繼承原理

在JavaScript當中&#xff0c;對象A如果要繼承對象B的屬性和方法&#xff0c;那么只要將對象B放到對象A的原型鏈上即可。而某個對象的原型鏈&#xff0c;就是由該對象開始&#xff0c;通過__proto__屬性連接起來的一串對象。__proto__屬性是JavaScript對象中的內部屬性&#xf…

XMPP

XMPP不支持視頻聊天 支持文字聊天 但對于圖片和語音聊天支持的不好 那么就將他們轉成NSData的形式 IM Instance Message 即時聊天 聊天系統中 XMPP主要做兩個人的聊天和群聊&#xff0c;只用了這兩個功能 還有一個HTTP的服務器 &#xff0c;他是一個旁路服務器 XMPP底層…

QT 調試

QT調試&#xff08;參考下面的說明就可以正常調試&#xff09;&#xff1a;http://blog.csdn.net/wchengshen/article/details/50254731http://blog.csdn.net/sx341125/article/details/53606534 QT調用DLL&#xff1a; Qt中調用VS編譯dll的方法(一)----顯式調用 qt使用動態庫(…

建模元件有哪些在MapleSim中

信號庫&#xff1a;包含通用信號模塊、布爾、控制器、離散信號模塊、信號源、線性信號模塊、非線性信號模塊、時間離散信號模塊、查詢表、信號轉換器、數學運算、關系元件、特殊信號模塊&#xff0c;應用案例。 電子庫&#xff1a;包含電阻、運算放大器、二極管、步進電機、模擬…

iOS小筆記

controller&#xff1a;連接二者的橋梁&#xff1b;cocoa frameworks 有兩個框架&#xff1a;foundationfoundation 是cocoa中最基本的一些類&#xff1b;再mac應用程序中負責對象管理&#xff0c;內存管理&#xff0c;容器等相關數據&#xff1b;uikit&#xff1a;uikit&…

【C++】VS2010將寫好的程序打包成安裝文件發布

參考鏈接&#xff1a;http://blog.csdn.net/yongh701/article/details/51326142 我們可以將自己寫好的VS2010程序打包成安裝文件&#xff0c;給用戶安裝&#xff0c;具體步驟如下&#xff1a; 1、如下圖&#xff0c;同樣是新建一個項目&#xff0c;但是這次是新建一個其它項目…

01_jeecms建站

一、環境安裝 JDK5TOMCAT5.5MYSQL5及以上http://www.jeecms.com/tutorial/index.jhtml參考環境安裝篇二、解壓文件安裝包jeecms-v5zip,如圖圖1ROOT文件夾復制放到tomcat下的webapps文件夾&#xff08;注&#xff1a;請先刪除webapps下原有的默認ROOT文件夾&#xff09;如不想部…

WiFi基本知識

轉自&#xff1a;http://blog.csdn.net/myarrow/article/details/7930131 1. IE802.11簡介 標準號IEEE 802.11bIEEE 802.11aIEEE 802.11gIEEE 802.11n標準發布時間1999年9月1999年9月2003年6月2009年9月工作頻率范圍2.4&#xff0d;2.4835GHz 5.150&#xff0d;5.350GHz5.475&a…

iOS各種小理論知識

Objective-C 部分 1. 你如何理解 OC 的內存管理 OC 內存管理是基于引用計數。誰想使用某個對象 B,就要把對象 B 的計數器1,如果不 使用這個對象了,那么就把對象 B 計數器-1,如果 B 對象計數器減到 0,那么 B 對象自動會調用自己的 dealloc 函數,也就是這個對象被銷毀。 一…

libev 宏展開

想看源碼&#xff0c;宏太多&#xff0c;看著累&#xff0c;宏展開&#xff0c;再看&#xff0c;功力時間不夠&#xff0c;先放下 放上宏展開后的代碼。 libev4.20 展開方示為 ./configure 修改makefile文件&#xff0c;字符串 替換CC為 CPP 注意要把基礎的CC定義保留 make mv …

FreeRTOS高級篇7---FreeRTOS內存管理分析

原文&#xff1a;http://blog.csdn.net/zhzht19861011/article/details/51606068 內存管理對應用程序和操作系統來說都非常重要。現在很多的程序漏洞和運行崩潰都和內存分配使用錯誤有關。 FreeRTOS操作系統將內核與內存管理分開實現&#xff0c;操作系統內核僅規定了必要的內…

筆試題

1.是不是一個父類寫了一個virtual 函數&#xff0c;如果子類覆蓋它的函數不加virtual ,也能實現多態? virtual修飾符會被隱形繼承的。private 也被集成&#xff0c;只事派生類沒有訪問權限而已。virtual可加可不加。子類的空間里有父類的所有變量(static除外)。同一個函數只存…

FreeRTOS學習筆記——互斥型信號量

來自&#xff1a;http://blog.csdn.net/xukai871105/article/details/43456985 0.前言 在嵌入式操作系統中互斥型信號量是任務間資源保護的重要手段。下面結合一個具體例子說明FreeRTOS中的互斥型信號量如何使用。 【相關博文】 【FreeRTOS STM32移植筆記】 【FreeRTOS學習筆記…