QT:關於QProcess中用write()函式呼叫cmd.exe程序的方法
一、實驗
剛接觸Qt兩月有餘,在實習的地方寫寫小工具,期間遇到不少問題,要麼在網上搜索看CSDN大牛的有關Qt的部落格,要麼自己看書,雖然浪費了不少時間,還好有點長進,解決了問題。廢話不多說,開始正題。
我的小工具中,需要呼叫在後臺呼叫cmd程式,用Qt實現類似下面的功能,
cmd中寫入一個exe可執行檔案,後面是可執行檔案需要的引數,然後回車就能執行出結果。起初網上搜到的都是用的 myProcess.startDetached(program,arguments);這個函式,其中引數的定義
QString program="cmd.exe";
QStringList arguments;
然後在網上找到示例程式運行了下,程式如下:
void MainWindow::on_pushButton_clicked() { QProcess myProcess; QString program; program.append("cmd.exe"); QStringList arguments; arguments<<"/c"<<"ping www.baidu.com"; myProcess.start(program, arguments); myProcess.waitForFinished(); QString strTemp = QString::fromLocal8Bit(myProcess.readAllStandardOutput()); QMessageBox testmes; testmes.setText(strTemp); testmes.exec(); myProcess.close(); }
可以執行出結果:
但是我應用這個函式時就不行成功,可能要寫引數時QStringList arguments; QStringList還沒搞清楚怎麼使用。
下來就開始嘗試用如下格式
//建立程序,開始執行程式 QProcess myProcess ; myProcess.start("cmd.exe"); //啟動cmd myProcess.write("E:\\Release\\Console.exe "); //寫入exe檔案 myProcess.write("E:\\Qtcode\\023.txt"); //寫入引數 myProcess.write("\n\r"); //回車 if(!myProcess.waitForStarted()) { int ret1 = QMessageBox::warning(this, tr("Warning"),tr("啟動失敗喔~"), QMessageBox::Abort); } myProcess.waitForFinished(); qDebug()<<"Error:"<<QString::fromLocal8Bit(myProcess.readAllStandardError()); myProcess.close(); //關閉程序
這樣就能呼叫執行成功了,其中有幾點切記們也是我走過的彎路,試了很多次才執行成功的;
-
myProcess.write("E:\\Release\\Console.exe ");裡面的路徑必須是E:\\Release\\Console.exe,這種格式,不能是E:\Release\Console.exe,也不能是E:/Release/Console.exe,Qt 識別的路徑格式只能是這種"E:\Release\Console.exe",只不過“\”需要轉義,所以要寫成"E:\\Release\\Console.exe"這種格式;
- 因為在cmd中輸入完exe路徑後,需要空一格再輸入引數路徑,所以在myProcess.write()中要注意把空格加上,所以我這句myProcess.write("E:\\Release\\Console.exe "),後面就多空了一格;
myProcess.write("\n\r");,這句是模仿在cmd敲完命令後回車,我試過好像不加這句也能執行,不過還是加上比較保險。
二、改進
這時候,我需要把myProcess.write("E:\\Release\\Console.exe ");中的路徑用引數代替,這其中也是曲曲折折,試了幾天才解決,還是太菜了,中間也是拖沓了效率低下,以後做事要提高效率,遠離手機,嘿嘿。
開始正題,myProcess.write();中,write()函式裡面要求的字串格式是 QIODevice::write(const char *data),其中QProcess::write()繼承的是QIODevice的write(),所以兩者是一樣的,說白了write()函式字串要求const char *形式的,我引數使用QString str = "E:\\Release\\Console.exe "; 是QString型別的,需要字串轉換,剛開始我以為 char* 和const char *沒有什麼區別,就嘗試QString->char* 格式,網上可以搜得到,這樣我除錯好久一直不知道哪裡的問題,有點絕望,後來我發現還有QString轉 const char * 格式,我再仔細看了下write()函式,才恍然大悟,還是自身基礎不好,沒有好好檢視函式的要求,最後我使用
QString str = "E:\\Release\\Console.exe ";
const char *cstr = str.toLocal8Bit().constData();
再將寫入函式myProcess.write(cstr);,這樣,程式才運行了起來。
補充下,QString 轉const char * 涉及到路徑問題,QString str需要四個"\",如"E:\\\\Release\\\\Console.exe ", 才可以,我也不知道為什麼,因為我嘗試E:\\Release\\Console.exe,時不成功。先寫這麼多,以後有問題再補充吧。歡迎討論。
相關推薦
QT:關於QProcess中用write()函式呼叫cmd.exe程序的方法
一、實驗 剛接觸Qt兩月有餘,在實習的地方寫寫小工具,期間遇到不少問題,要麼在網上搜索看CSDN大牛的有關Qt的部落格,要麼自己看書,雖然浪費了不少時間,還好有點長進,解決了問題。廢話不多說,開始正題。 我的小工具中,需要呼叫在後臺呼叫cmd程式,用Qt實現類似下面的功能
Qt關於QProcess使用startDetached函式問題
最近專案編寫自動升級程式使用程序通訊,網上檢視大部分資料都使用QProcess類,再使用函式startDetached過程發現一種很奇怪現象,父程序通過startDetached呼叫子程序,原則上父程序和子程序脫離關係,關閉父程序不會關閉子程序。但是 子程序通過獲取父程序P
Qt:解決跨執行緒呼叫socket/IO類,導致報錯的問題(socket notifiers cannot be enabled from another thread)
Qt有很多IO相關的類,比如說QTcpSocket、QFile,總的來說,在Qt的框架內使用,還是非常方便的。 但是用過其他框架IO類的人,可能有一個很不習慣,就是Qt的所有IO類,都不推薦或者不可以跨執行緒操作,不然就會報錯,比如說操作QTcpSocket跨
python 呼叫cmd命令的方法
1、os.system('cmd')執行成功返回0,否則返回1,在執行的終端會輸出執行結果,但是不能儲存輸出結果。2、commands.getstatusoutput('cmd')status ,output = commands.getstatusoutput('cmd')
C#程式呼叫cmd.exe執行命令
public class CmdHelper { private static string CmdPath = @"C:\Windows\System32\cmd.exe"; /// <summary
Python設定函式呼叫超時,程序卡住
import time import signal def test(i): time.sleep(i % 4) print "%d within time" % (i) return i if __name__ == '__main__': def handler(s
Qt中訊號和槽函式的3種對映方法
在Qt Creater中提供了三種建立訊號和槽的方法,詳細介紹如下: 實現功能:點選OK按鈕,TextLabel顯示“Hello World” 詳細過程: 首先,執行Qt Creater,建立Qt Gui application工程。 其次,在點選.ui檔案,在控制元件欄
求二維陣列最大最小值----利用函式呼叫形式(2種方法)
(1)利用氣泡排序思想求二維陣列中的最大值 /* 利用函式呼叫形式,傳遞二維陣列名進行函式呼叫 設計求二維陣列中最小值、最大值的函式,在主函式中呼叫 利用氣泡排序思想求二維陣列最大值。 演算法思想:先對各行進行一次氣泡排序,使每行的最後一個數為當前行中最大值, 即二維
Java中main函式呼叫同類中的方法
1、需要建立這個類的例項,再進行呼叫 public class Test{ public static void main(String[] args){ Test t = new Test(); t.train(); } voidtrain(){ System.out.println("china")
在linux kernel中列印函式呼叫的堆疊的方法
在linux核心除錯中,經常用到的列印函式呼叫堆疊的方法非常簡單,只需在需要檢視堆疊的函式中加入: dump_stack();或 __backtrace();即可。 dump_stack()在~/kernel/ lib/Dump_stack.c中定義 void
Qt 呼叫外部exe的方法
近期做個快捷選單,需要呼叫外部.exe應用程式。 呼叫外部應用程式時分為阻塞和非阻塞,這裡採用非阻塞,因為想呼叫哪個程式就呼叫哪個程式嘛。 方法如下: 使用Qprocess的startDetached()方法,當前程式關閉時,呼叫的外部程式能夠照常執行。
BAT指令碼獲取當前cmd.exe程序PID/PPID/資訊(自殺指令碼)
@ echo off REM get cmd pid set TempFile=%TEMP%\sthUnique.tmp wmic process where (Name="wmic.exe" AND CommandLine LIKE "%%%TIME%%%") get ParentProcessId /va
Qt技巧:QProcess與外部程式的呼叫
專案做到一定階段,常常須要在原來的project上呼叫外部程式。 Qt為此提供了QProcess類,QProcess可用於完畢啟動外部程式,並與之互動通訊。 一、啟動外部程式的兩種方式: (1)一體式:void QProcess::start(const QString & pr
利用切片操作,實現一個trim()函式,去除字串首尾的空格,注意不要呼叫str的strip()方法:# 測試: if trim('hello ') != 'hello': print('測試失敗!') elif trim(' hello'
def trim(s): k = 0 '''while迴圈判斷輸入字串是否為空值''' while k < len(s): if s[k] == ' ': #如果是空字元則記錄字元的個數 k = k + 1 #k自增來記錄數值
利用切片操作,實現一個trim()函式,去除字串首尾的空格,注意不要呼叫str的strip()方法:
1,首先判斷字串是否是空,如果是直接返回字串; 2,迴圈判斷字串從第一個開始是否是空格,如果是則去掉空格,每次去掉空格後判斷剩下的是否是空,如果是返回字串 3,迴圈判斷字串從最後一個開始往前是否是空格,如果是則去掉空格,每次去掉空格後判斷剩下的是否是空,如果是返回字串 4,空格都去掉後返
Qt:Qt使用滑鼠模擬函式mouse_event和按鍵模擬函式keybd_even實現網頁重新整理功能
用Qt實現網頁重新整理功能 前言 在上一篇部落格Qt:使用Qt實現網頁自動重新整理工具,使用了PostMassage函式 通過Windows的訊息機制實現的網頁重新整理功能。因為訊息種類太多,不方便使用和記憶,所以Windows下的大部分訊息可以使用對應等價的API函式,不必直接
QT點選"X"按鈕,呼叫closeEvent()函式來實現呼叫特定事件
背景: QT在使用者關閉視窗(直接點選"X"鍵)時,程式一般都需要做一些善後的事情,就我現在的程式來說,既關閉USB。如何實現? 正文: 首先,在對應窗體的".h"檔案包含 #include <QCloseEvent>;的標頭檔案。 其
C++中帶有預設引數的宣告和定義。Qt中重寫預設建構函式。C++中函式呼叫時實參個數和函式定義時的形參個數不一致時的處理。
1、Qt中自動生成的建構函式 (1)Qt中自動生成的建構函式的宣告 class Chat : public QWidget { Q_OBJECT public: explicit Chat(QWidget *parent = 0); //宣告建構函式,可以帶有初始值“=0”
linux:核心如何定位並呼叫裝置驅動初始化函式
寫過linux驅動程式的人都知道需要將驅動的初始化函式通過module_init註冊,然後在通過menuconfig配置的時候選擇隨核心一起編譯(非模組),系統在啟動的時候就能夠自動呼叫驅動初始化函數了。真是一件神奇的事情! #include <linu
ARM基礎:為何C語言(的函式呼叫)需要堆疊,而組合語言卻不需要堆疊
https://www.cnblogs.com/liuchengchuxiao/p/4113233.html 為何C語言(的函式呼叫)需要堆疊,而組合語言卻不需要堆疊 之前看了很多關於uboot的分析,其中就有說要為C語言的執行,準備好堆疊。 而自己在Uboot的start.S彙編程