跳至主要內容

Qt

LincZero大约 1 分钟

Qt

目录

终端操作

参考

ping

方案1

等待数据全部接受完毕会才显示

void MainWindow::on_btnPing_clicked(){
    QProcess myProcess(this);							// 建立程序对象
    QString program = "C:/Windows/System32/cmd.exe";	// 程序路径
    QStringList arguments;								// 参数列表,并传入参数
    arguments <<"/c" <<"ping www.baidu.com";
    myProcess.start(program,arguments);					// 以参数启动程序,并等待程序完成
    myProcess.waitForFinished();						// 阻塞(单线程下回阻塞当前进程)
    QString qstr = QString::fromLocal8Bit(myProcess.readAllStandardOutput());	// 获取返回内容,并显示
    ui->textBrowser->setText(qstr);
}

方案2

能即时显示

//mainwindow.cpp文件,主界面实现
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <qdebug.h>
#include <qprocess.h>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow){
    ui->setupUi(this);
}
MainWindow::~MainWindow(){
    delete ui;
}
void MainWindow::on_btnPing_clicked(){
    qDebug()<<QStringLiteral("开始点击");
    ui->textBrowser->clear();
    ui->textBrowser->setText(QStringLiteral("请等待"));
    ui->textBrowser->update();
	
    // 外部程序部分
    QProcess myProcess(this);
    QString program = "C:/Windows/System32/cmd.exe";
    QStringList arguments;
    arguments <<"/c" <<"ping www.baidu.com";
    myProcess.start(program,arguments);

    /** 每100ms检查一次
     * 阻塞直到程序结束或过指定时间(后面的参数默认是30000)。进程完成返回true,否则false
    **/
    while (myProcess.waitForFinished(100) == false) {
        QByteArray qByteRead = myProcess.readAllStandardOutput();	// 读结果
        if (!qByteRead.isEmpty()) {
            ui->textBrowser->append(QString::fromLocal8Bit(qByteRead));	// append实时更新内容
            repaint();	// 立刻调用paintEvent重绘部件,除非禁用更新或隐藏小部件(update()好像会更好)
        }
    }
    QByteArray qByteRead = myProcess.readAllStandardOutput();
    ui->textBrowser->append(QString::fromLocal8Bit(qByteRead));

    qDebug()<<QString::fromLocal8Bit(qByteRead);
    qDebug()<<"结束点击";
}