Qt之啟動外部程序(使用參數很全面,還使用了setProcessChannelMode)


簡述

QProcess可以用來啟動外部程序,並與它們交互。

要啟動一個進程,通過調用start()來進行,參數包含程序的名稱和命令行參數,參數作為一個QStringList的單個字符串。

另外,也可以使用setProgram()和setArguments()來運行,然后調用start()或open()。

接口

  • start() 啟動外部程序

  • readAllStandardError() 從標准錯誤中獲取所有數據

  • readAllStandardOutput() 從標准輸出中獲取所有數據

  • write() 繼承於QIODevice

  • close() 繼承於QIODevice

除此之外,QProcess還包含靜態成員函數:

  • execute() 啟動一個進程,然后等待該進程結束。

  • startDetached() 啟動一個進程,然后使其和當前進程脫離進程的父子關系。

示例

cmd

啟動cmd

 1 QProcess process(this); 2 process.startDetached("cmd.exe"); 

cmd帶參數

使用cmd來刪除本地文件

1 QProcess process(this);
2 process.start("cmd.exe");
3 process.write ("del E:\\a.txt\n\r"); process.write ("exit\n\r"); process.waitForFinished(); process.close();

cmd獲取返回值

使用cmd來查看網絡狀況

 1 QStringList arguments;
 2 arguments << "/c" << "ping www.baidu.com";
 3 QProcess process(this); 
 4 process.start("cmd.exe", arguments); 
 5 process.waitForStarted(); 
 6 process.waitForFinished(); 
 7 QString strResult = QString::fromLocal8Bit(process.readAllStandardOutput()); 
 8 QMessageBox msgBox(this); 
 9 msgBox.setText(strResult); 
10 msgBox.exec();

putty遠程登錄

1 QString program = "E:/Putty.exe";
2 QStringList arguments;
3 arguments<< "-pw" << "wang" << QString("%1@%2").arg("root").arg("172.18.5.73");
4 QProcess *process = new QProcess(this);
5 process->setProcessChannelMode(QProcess::SeparateChannels);
6 process->setReadChannel(QProcess::StandardOutput);
7 process->start(program, arguments, QIODevice::ReadWrite);

WinSCP遠程文件傳輸

1 QString program = QCoreApplication::applicationDirPath() + "/WinSCP/WinSCP.exe";
2 QStringList arguments;
3 arguments << QString("%1:%2@%3:%4").arg("root").arg("wang").arg("172.18.5.73").arg(22); 
4 QProcess *process = new QProcess(this); 
5 process->setProcessChannelMode(QProcess::SeparateChannels); 
6 process->setReadChannel(QProcess::StandardOutput); 
7 process->start(program, arguments, QIODevice::ReadWrite);

管道

一個進程的標准輸出流到目標進程的標准輸入。

command1 | command2

可以用下面代碼實現:

1 QProcess process1;
2 QProcess process2;
3  
4 process1.setStandardOutputProcess(&process2);
5  
6 process1.start("command1");
7 process2.start("command2");

錯誤處理

啟動外部程序,當發生錯誤時,可以根據指定的錯誤描述所發生的錯誤類型。

 1 connect(process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(processError(QProcess::ProcessError)));
 2  
 3 void processError(QProcess::ProcessError error)
 4 {
 5     switch(error)
 6     {
 7     case QProcess::FailedToStart: QMessageBox::information(0, "Tip", "FailedToStart"); 
 8 break; 
 9 case QProcess::Crashed: 
10 QMessageBox::information(0, "Tip", "Crashed"); 
11 break; 
12 case QProcess::Timedout: 
13 QMessageBox::information(0, "Tip", "Timedout"); 
14 break; 
15 case QProcess::WriteError: 
16 QMessageBox::information(0, "Tip", "WriteError"); 
17 break; 
18 case QProcess::ReadError: 
19 QMessageBox::information(0, "Tip", "ReadError"); 
20 break; 
21 case QProcess::UnknownError: 
22 QMessageBox::information(0, "Tip", "UnknownError"); 
23 break; 
24 default: 
25 QMessageBox::information(0, "Tip", "UnknownError"); 
26 break; 
27 } 
28 }
29 
30 
31 假設不存在對應的外部程序,則會返回錯誤類型
32 QProcess::FailedToStart

參數arguments

以putty遠程登錄為例,putty可以使用命令行putty [-pw password] user@ip來進行連接。

所以中間為空格的地方使用arguments進行單個字符串分離:

1 QStringList arguments;
2 arguments<< "-pw" << "wang" << QString("%1@%2").arg("root").arg("172.18.5.73");

其它參數類似。

1 QProcess process;
2 process.start("del /s *.txt");
3 //等同於process.start("del", QStringList() << "/s" << "*.txt");

獲取環境變量

返回調用進程的環境變量作為一個鍵值對列表。

 1 QStringList environment = QProcess::systemEnvironment(); 2 //environment = {"PATH=/usr/bin:/usr/local/bin", "USER=greg", "HOME=/home/greg"} 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM