admin管理员组文章数量:1516870
QT多进程编程
单个进程
使用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的结果:
本文标签: QT多进程编程
版权声明:本文标题:QT多进程编程 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.betaflare.com/biancheng/1706635828a698636.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。


发表评论