首页 > 编程知识 正文

qt 多进程开发,QT多线程

时间:2023-05-06 06:48:23 阅读:225831 作者:113

单个进程

使用QT中的QProcess类来启动一个外部·程序并与其进行通信。

要启动一个进程,可以使用start()函数,然后传递给该函数程序名称和运行这个程序所要使用的命令行参数。

执行完start函数,QProcess进入Starting状态,程序运行后QProcess进入Running状态并发射started()信号。进程退出后,QProcess重新进入NotRunning状态(初始状态)并发射finished()信号,这个信号提供了进程的退出代码和退出状态。

可以使用exitCode()来获取上一个结束进程的退出代码,使用exitStatus()来获取退出状态。

当任何时候发生错误,QProcess都会发生发射error()信号。可以使用error()来查看错误的类型和上次发生的错误。使用state()来查看当前进程的状态。

单进程案例

(1)在VS中新建QT项目,名称为QProcess_1,然后在ui界面拖入push button,文本修改为“启动一个进程”。

(2)进入QProcess_1.h文件,先添加头文件#include <QProcess>,然后添加私有对象定义:QProcess myProcess。然后给(1)中的push button添加槽函数void on_pushButton_clicked()声明,并在cpp文件中给出详细定义(同时也要在ui界面中完成槽函数和push button的关联)

void QProcess_1::on_pushButton_clicked(){QString program = "cmd.exe";QStringList argumentes;argumentes << "/c dir&pause";myProcess.start(program, argumentes);}

其中program为程序名称,arguments为命令行参数。命令行参数使用"/c dir&pause",这里的"/c"指定命令dir在cmd中执行,"&pause"指定运行命令后暂停。

(3)步骤二使用cmd执行了一个命令dir,可以用QProcess的一些信号进行关联。

在QProcess_1.h文件中添加私有槽声明:

void showResult();void showState(QProcess::ProcessState);void showError();void showFinished(int,QProcess::ExitStatus);

在cpp文件中的构造函数中添加信号与槽的关联:

QProcess_1::QProcess_1(QWidget *parent): QMainWindow(parent){ui.setupUi(this);connect(&myProcess, SIGNAL(readyRead()), this, SLOT(showResult()));connect(&myProcess, SIGNAL(stateChanged(QProcess::ProcessState)), this, SLOT(showState(QProcess::ProcessState)));connect(&myProcess, SIGNAL(error(QProcess::ProcessError)), this, SLOT(showError()));connect(&myProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(showFinished(int, QProcess::ExitStatus)));connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(on_pushButton_clicked()));}

(4)完整程序代码:

QProcess_1.h

#pragma once#include <QtWidgets/QMainWindow>#include "ui_QProcess_1.h"#include <QProcess>class QProcess_1 : public QMainWindow{Q_OBJECTpublic:QProcess_1(QWidget *parent = Q_NULLPTR);private:Ui::QProcess_1Class ui;QProcess myProcess;private slots:void on_pushButton_clicked();void showResult();void showState(QProcess::ProcessState);void showError();void showFinished(int,QProcess::ExitStatus);};

QProcess_1.cpp

#include "QProcess_1.h"#include <QDebug>QProcess_1::QProcess_1(QWidget *parent): QMainWindow(parent){ui.setupUi(this);connect(&myProcess, SIGNAL(readyRead()), this, SLOT(showResult()));connect(&myProcess, SIGNAL(stateChanged(QProcess::ProcessState)), this, SLOT(showState(QProcess::ProcessState)));connect(&myProcess, SIGNAL(error(QProcess::ProcessError)), this, SLOT(showError()));connect(&myProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(showFinished(int, QProcess::ExitStatus)));connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(on_pushButton_clicked()));}void QProcess_1::on_pushButton_clicked(){QString program = "cmd.exe";QStringList argumentes;argumentes << "/c dir&pause";myProcess.start(program, argumentes);}void QProcess_1::showResult(){qDebug() << "showResult:" << endl << QString(myProcess.readAll());}void QProcess_1::showState(QProcess::ProcessState state){qDebug() << "showState";if (state == QProcess::NotRunning)qDebug() << "NotRunning";else if(state== QProcess::Starting)qDebug() << "Starting";elseqDebug() << "Running";}void QProcess_1::showError(){qDebug() << "showError:" << endl << myProcess.errorString();}void QProcess_1::showFinished(int exitCode, QProcess::ExitStatus exitStatus){qDebug() << "showFinished:" << endl << exitCode << exitStatus;}

其中readAll()函数可以读取所有的运行结果。

main.cpp

#include "QProcess_1.h"#include <QtWidgets/QApplication>#include <QTextCodec>int main(int argc, char *argv[]){QApplication a(argc, argv);QProcess_1 w;//QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());w.show();return a.exec();}

(5) 执行结果

在windows下真实使用dir的结果:

 

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。