1. 程式人生 > >QT:關於QProcess中用write()函式呼叫cmd.exe程序的方法

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();                                          //關閉程序

 這樣就能呼叫執行成功了,其中有幾點切記們也是我走過的彎路,試了很多次才執行成功的;

  1. 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"這種格式;
  2. 因為在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,空格都去掉後返

QtQt使用滑鼠模擬函式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彙編程