日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Qt之啟動(dòng)外部程序

 昵稱52164085 2018-01-19

簡(jiǎn)述

QProcess可以用來(lái)啟動(dòng)外部程序,并與它們交互。

要啟動(dòng)一個(gè)進(jìn)程,通過(guò)調(diào)用start()來(lái)進(jìn)行,參數(shù)包含程序的名稱和命令行參數(shù),參數(shù)作為一個(gè)QStringList的單個(gè)字符串。

另外,也可以使用setProgram()和setArguments()來(lái)運(yùn)行,然后調(diào)用start()或open()。

接口

  • start() 啟動(dòng)外部程序

  • readAllStandardError() 從標(biāo)準(zhǔn)錯(cuò)誤中獲取所有數(shù)據(jù)

  • readAllStandardOutput() 從標(biāo)準(zhǔn)輸出中獲取所有數(shù)據(jù)

  • write() 繼承于QIODevice

  • close() 繼承于QIODevice

除此之外,QProcess還包含靜態(tài)成員函數(shù):

  • execute() 啟動(dòng)一個(gè)進(jìn)程,然后等待該進(jìn)程結(jié)束。

  • startDetached() 啟動(dòng)一個(gè)進(jìn)程,然后使其和當(dāng)前進(jìn)程脫離進(jìn)程的父子關(guān)系。

示例

cmd

啟動(dòng)cmd

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

cmd帶參數(shù)

使用cmd來(lái)刪除本地文件

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

cmd獲取返回值

使用cmd來(lái)查看網(wǎng)絡(luò)狀況

QStringList arguments;
arguments << "/c" << "ping www.baidu.com";

QProcess process(this);
process.start("cmd.exe", arguments);
process.waitForStarted();
process.waitForFinished();
QString strResult = QString::fromLocal8Bit(process.readAllStandardOutput());

QMessageBox msgBox(this);
msgBox.setText(strResult);
msgBox.exec();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

putty遠(yuǎn)程登錄

QString program = "E:/Putty.exe";

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

QProcess *process = new QProcess(this);
process->setProcessChannelMode(QProcess::SeparateChannels);
process->setReadChannel(QProcess::StandardOutput);
process->start(program, arguments, QIODevice::ReadWrite);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

WinSCP遠(yuǎn)程文件傳輸

QString program = QCoreApplication::applicationDirPath() + "/WinSCP/WinSCP.exe";

QStringList arguments;
arguments << QString("%1:%2@%3:%4").arg("root").arg("wang").arg("172.18.5.73").arg(22);

QProcess *process = new QProcess(this);
process->setProcessChannelMode(QProcess::SeparateChannels);
process->setReadChannel(QProcess::StandardOutput);
process->start(program, arguments, QIODevice::ReadWrite);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

管道

一個(gè)進(jìn)程的標(biāo)準(zhǔn)輸出流到目標(biāo)進(jìn)程的標(biāo)準(zhǔn)輸入。

command1 | command2

可以用下面代碼實(shí)現(xiàn):

QProcess process1;
QProcess process2;

process1.setStandardOutputProcess(&process2);

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

錯(cuò)誤處理

啟動(dòng)外部程序,當(dāng)發(fā)生錯(cuò)誤時(shí),可以根據(jù)指定的錯(cuò)誤描述所發(fā)生的錯(cuò)誤類型。

connect(process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(processError(QProcess::ProcessError)));

void processError(QProcess::ProcessError error)
{
    switch(error)
    {
    case QProcess::FailedToStart:
        QMessageBox::information(0, "Tip", "FailedToStart");
        break;
    case QProcess::Crashed:
        QMessageBox::information(0, "Tip", "Crashed");
        break;
    case QProcess::Timedout:
        QMessageBox::information(0, "Tip", "Timedout");
        break;
    case QProcess::WriteError:
        QMessageBox::information(0, "Tip", "WriteError");
        break;
    case QProcess::ReadError:
        QMessageBox::information(0, "Tip", "ReadError");
        break;
    case QProcess::UnknownError:
        QMessageBox::information(0, "Tip", "UnknownError");
        break;
    default:
        QMessageBox::information(0, "Tip", "UnknownError");
        break;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

假設(shè)不存在對(duì)應(yīng)的外部程序,則會(huì)返回錯(cuò)誤類型QProcess::FailedToStart。

參數(shù)arguments

以putty遠(yuǎn)程登錄為例,putty可以使用命令行putty [-pw password] user@ip來(lái)進(jìn)行連接。

所以中間為空格的地方使用arguments進(jìn)行單個(gè)字符串分離:

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

其它參數(shù)類似。

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

獲取環(huán)境變量

返回調(diào)用進(jìn)程的環(huán)境變量作為一個(gè)鍵值對(duì)列表。

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

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多