Qt執行dos命令並獲取控制台輸出

2021-08-20 08:30:51 字數 2236 閱讀 5389

應用場景與問題描述

問題是這樣的,我寫了很多命令列程式用於處理遙感影像,這種方式很方便,可以通過dos或shell指令碼來實現批處理。但這也引起乙個問題,當我在整合時偷懶,不想做介面,而使用者又必須要求有個介面時,我不得不做乙個視窗來體現我是有介面的,於是我決定直接呼叫我的可執行程式或者批處理指令碼,但這些命令和指令碼不能在終端或dos視窗裡執行。這個問題簡單的抽象為執行乙個"ping localhost"的命令,並且把輸出重定向到我的訊息視窗裡。

標頭檔案:

#ifndef qtwinmsg_h

#define qtwinmsg_h

#include #include "ui_qtwinmsg.h"

#include "worker.h"

class qtwinmsg : public qmainwindow

;#endif // qtwinmsg_h

原始檔:

#include "qtwinmsg.h"

#include #include #include #include qtwinmsg::qtwinmsg(qwidget *parent)

: qmainwindow(parent)

qtwinmsg::~qtwinmsg()

void qtwinmsg::ontest()

startupinfo si;

process_information pi;

si.cb = sizeof(startupinfo);

getstartupinfo(&si);

si.hstderror = hwrite;

si.hstdoutput = hwrite;

si.wshowwindow = sw_hide;

si.dwflags = startf_useshowwindow | startf_usestdhandles;

//關鍵步驟,createprocess函式引數意義請查閱msdn

if (!createprocess(null, ppcmd

,null,null,true,null,null,null,&si,&pi))

closehandle(hwrite);

char buffer[4096] = ;

dword bytesread;

//ofstream outfile("log.txt");

while (true) }

執行效果:

這樣可以實現目標,但是在qt程式裡使用了win32 api,這是有點彆扭,另外輸出的訊息並不是動態的輸出,而是在執行完畢後一下子刷出來,即使我們通過qthread,把處理過程放到其它執行緒裡,然後通過非同步的事件來重新整理訊息輸出也是實現不了動態訊息效果。總體來說,這種方式是不完美的。

我想qt應該有自己的方式。通過檢視qt的幫助,很快就可以找到做這個事情的類qprocess,qprocess可以同於執行外部程式和命令,並且支援訊息重定向和標準輸入、輸出,有了qprocess類,前面講到的問題就可以簡單的通過下面的方式來實現了:

標頭檔案:

#ifndef test2_h

#define test2_h

#include #include #include "ui_test2.h"

class test2 : public qwidget

;#endif // test2_h

原始檔:

#include "test2.h"

#include test2::test2(qwidget *parent)

: qwidget(parent),m_process(new qprocess)

test2::~test2()

void test2::ontest()

void test2::onoutput()

執行效果:

QT 控制台輸出

首先在標頭檔案中包含 include 在需要使用的地方插入 qdebug intensity d intensity 0 2 d表示整數 輸出結果 intensity 195 注 a,a 讀入乙個浮點值 僅c99有效 c 讀入乙個字元 d 讀入十進位制整數 i 讀入十進位制,八進位制,十六進製制整數...

Qt 控制台程式

1.建立乙個控制台工程 包含乙個.pro檔案和main.cpp檔案 q t core qt gui config c 11 工程名target test 工程的型別是控制台 config consoleconfig變數 配置變數指定了編譯器所要使用的選項和所需要被連線的庫。配置變數中可以新增任何東西...

python 執行終端 控制台命令

import os os.system os.popen read strip 上面2種方法 是python 執行終端 控制台 命令的常見方法 os.system ping www.baidu.com 執行成功 返回 0 ping os.popen pint www.baidu.com read s...