QT笔记——QProcess学习

这篇具有很好参考价值的文章主要介绍了QT笔记——QProcess学习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我们常常想通过某一个类,来启动一个外部进程

本文将讲解如何通过QProcess来进行启动外部进程

一:了解QProcess

QProcess是Qt框架提供的一个类,用于在应用程序中执行外部进程。它提供了一系列函数来启动、控制和与外部进程进行交互

1.启动进程的方式:
(1.1)分离式:外部程序启动程序后,主程序退出时,被调用的进程继续执行,不退出
QT笔记——QProcess学习,qt,笔记,学习

[static] bool QProcess::startDetached(const QString &program, const QStringList &arguments, const QString &workingDirectory = QString(), qint64 *pid = nullptr)

(1.2)一体式:当主程序退出时,被主程序调用起来的进程也退出

start还有其他的重载的函数,下面是其中一个
QT笔记——QProcess学习,qt,笔记,学习

void QProcess::start(const QString &program, const QStringList &arguments, QIODevice::OpenMode mode = ReadWrite)

2:常用的阻塞函数

// 主进程阻塞,直到外部程序启动完毕,
waitForStarted()
 
// 主进程阻塞,直到外部程序执行完毕
waitForFinished() 

3:被调用进程接受数据

QStringList list = QCoreApplication::arguments();
//为什么试3个呢,我明明参数是传的两个  因为第一个参数是我们传的exe启动 全路径 C:\Users\admin\Desktop\a.exe
if (list.size() == 3)
{
	QString exeFileName= list.at(0);
	QString oneStr = list.at(1);
	QString twoStr= list.at(2);
}

4:主进程接受被调用进程的数据
(4.1)使用QFile输出内容被 主进程捕获

QFile file;
file.open(1, QFile::WriteOnly);
file.write("finished");
file.close();

(4.2)使用输出流 被 主进程捕获

 cout << "it's message" << endl;

5:常用的信号
QT笔记——QProcess学习,qt,笔记,学习

//启动完毕
connect(process, &QProcess::started, this, [=]()
{
			
});

//捕获到消息时
connect(process, &QProcess::readyReadStandardOutput, this, [=]()
{

});

//完成
connect(process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [=](int exitCode, QProcess::ExitStatus exitStatus)
{

});

//状态改变
connect(process, &QProcess::stateChanged, this, [=](QProcess::ProcessState state)
{
	
});

二:使用QPrecess

1:startDetached 启动进程

1:使用了startDetached来启动进程,信号都是无效的,接受不到任何消息
2:当主进程关闭时,被调用的QTcpClientTest.exe 是不会退出的
3:主进程发送的参数,被调用的QTcpClientTest.exe 依然可以接受

void QTcpSeverTest::on_btn1_clicked()
{
	QProcess* process = new QProcess(this);
	QString str = QApplication::applicationDirPath() + "/QTcpClientTest.exe";

	QStringList list;
	list.append("123");
	list.append("456");

	//分离式 启动外部进程
	process->startDetached(str, list);
	
	//无效
	connect(process, &QProcess::started, this, [=]()
		{
			qDebug() << "started";
		});

	//无效
	connect(process, &QProcess::readyReadStandardOutput, this, [=]()
		{
			QString qstr(process->readAllStandardOutput());
			qDebug() << "startDetached:" << qstr;
		});

	connect(process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [=](int exitCode, QProcess::ExitStatus exitStatus)
		{
			QString result = process->readAll();
			qDebug() << "result:" << result;
		});

	//无效
	connect(process, &QProcess::stateChanged, this, [=](QProcess::ProcessState state)
		{
			qDebug() << "show state:";
			switch (state)
			{
			case QProcess::NotRunning:
				qDebug() << "Not Running";
				break;
			case QProcess::Starting:
				qDebug() << "Starting";
				break;
			case QProcess::Running:
				qDebug() << "Running";
				break;
			default:
				qDebug() << "otherState";
				break;
			}

		});

}

2:start启动进程

1:使用了startDetached来启动进程,信号都是可以接受的
2:当主进程关闭时,被调用的QTcpClientTest.exe 是随着主进程一起退出
3:主进程发送的参数,被调用的QTcpClientTest.exe 可以接受参数

	QProcess* process = new QProcess(this);
	QString str = QApplication::applicationDirPath() + "/QTcpClientTest.exe";

	QStringList list;
	list.append("bbbbb");
	list.append("aaaaa");

	//启动完毕
	connect(process, &QProcess::started, this, [=]()
	{
			qDebug() << "started:" ;
	});

	//捕获到消息时
	connect(process, &QProcess::readyReadStandardOutput, this, [=]()
	{
			QString qstr(process->readAllStandardOutput());
			qDebug() << "readyReadStandardOutput:" << qstr;
	});

	//完成
	connect(process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [=](int exitCode, QProcess::ExitStatus exitStatus)
	{
			if (exitStatus == QProcess::NormalExit) {
				qDebug() << "Process finished with exit code:" << exitCode;
			}
			else {
				qDebug() << "Process crashed!";
			}
	});

	//状态改变
	connect(process, &QProcess::stateChanged, this, [=](QProcess::ProcessState state)
	{
			qDebug() << "show state:";
			switch (state)
			{
			case QProcess::NotRunning:
				qDebug() << "Not Running";
				break;
			case QProcess::Starting:
				qDebug() << "Starting";
				break;
			case QProcess::Running:
				qDebug() << "Running";
				break;
			default:
				qDebug() << "otherState";
				break;
			}

	});

	//一体式  启动外部进程
	process->start(str, list);

3:execute()启动进程

1:使用了execute来启动进程,信号是无效的
2:主进程一直处于阻塞状态,等待被调用的QTcpClientTest.exe完成(关闭软件)

	QProcess* process = new QProcess(this);
	QString str = QApplication::applicationDirPath() + "/QTcpClientTest.exe";

	QStringList list;
	list.append("bbbbb");
	list.append("aaaaa");

	//无效
	connect(process, &QProcess::started, this, [=]()
		{
			qDebug() << "started:";
		});

	//无效
	connect(process, &QProcess::readyReadStandardOutput, this, [=]()
		{
			QString qstr(process->readAllStandardOutput());
			qDebug() << "readyReadStandardOutput:" << qstr;
		});

	//无效
	connect(process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [=](int exitCode, QProcess::ExitStatus exitStatus)
		{
			QString result = process->readAll();
			qDebug() << "result:" << result;
		});

	//无效
	connect(process, &QProcess::stateChanged, this, [=](QProcess::ProcessState state)
		{
			qDebug() << "show state:";
			switch (state)
			{
			case QProcess::NotRunning:
				qDebug() << "Not Running";
				break;
			case QProcess::Starting:
				qDebug() << "Starting";
				break;
			case QProcess::Running:
				qDebug() << "Running";
				break;
			default:
				qDebug() << "otherState";
				break;
			}

		});

	//如果进程 QTcpClientTest 不关闭 或者完成 , 则此进程一直卡住
	int exitCode = QProcess::execute(str, list);
	if (exitCode != 0) {
		qDebug() << "外部程序执行失败";
	}

	//接受进程捕获到输出的消息
	QByteArray output = process->readAllStandardOutput();
	QString msg = QString::fromLocal8Bit(output);
	qDebug() << msg;

打印的信息为:QIODevice::read (QProcess): device not open,说明execute没有打开设备,接受不到消息

4:start() + waitForFinished()启动进程

1:使用了execute来启动进程,信号是无效的
2:主进程一直处于阻塞状态,等待被调用的QTcpClientTest.exe完成(关闭软件)

	QProcess* process = new QProcess(this);
	QString str = QApplication::applicationDirPath() + "/QTcpClientTest.exe";

	QStringList list;
	list.append("bbbbb");
	list.append("aaaaa");

	//启动进程
    process->start(str,list);

    // 等待进程完成
    process->waitForFinished();

	//接受进程捕获到输出的消息
    QByteArray output = process->readAllStandardOutput();
    QString msg = QString::fromLocal8Bit(output);
    qDebug() << msg;

完整代码:
QProcess完整学习代码

参考博客:
QProcess使用 一
QProcess使用 二
QProcess使用 三
QProcess使用 四
QProcess使用 五文章来源地址https://www.toymoban.com/news/detail-650793.html

到了这里,关于QT笔记——QProcess学习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QT笔记——QT类反射机制简单学习

    学习 QT的 类反射机制 使用Qt 反射机制的条件 1.需要继承自QObject 类 或者 它的 派生类 ,并需要在类中加入Q_OBJECT 宏 2.注册成员函数:若希望普通成员函数能够被反射,需要在函数声明之前加入Q_INVOKABLE 宏。 3.注册成员变量:若希望成员变量能被反射,需要使用Q_PROPERTY 宏。

    2024年02月09日
    浏览(122)
  • QT学习笔记-QT安装oracle oci驱动

    在使用QT开发应用的过程中,往往会把应用使用过程中产生的数据放入数据库进行统一存储,因此通过QT实现数据库的访问可以说是必须的一个知识点,其实QT访问数据库的语法及相关类和方法的使用并不复杂,但是对于使用QT的新人来说往往会开在数据库驱动加载的地方,比

    2024年02月12日
    浏览(55)
  • Qt学习笔记5---如何在Qt中添加资源文件

              前言: 在我们给Qt加上图片的时候,可以用本地资源添加的方式,但是此方法代码用的只能是本地资源,不好共享。那么我们可以把资源文件添加在Qt中,这样就不会出现这种问题啦! 第一步:在本地复制你想用的资源文件,点开项目的“在Explorer中显示”,粘贴

    2024年02月16日
    浏览(45)
  • 学习Qt笔记

    前言: 一、Qt Creator 使用技巧  二、 Qt的元对象系统 2.1 Qt的元对象系统概述 2.1.2 属性系统  2.1.3 信号与槽  2.1.4 对象数  2.2  容器类 三、常用界面组件使用 3.1 QString字符串操作         学习笔记的内容来自 B站up主 阿西拜编程 《Qt6 C++开发指南 》2023(上册,完整版)_哔哩

    2024年01月21日
    浏览(35)
  • QT 学习笔记(七)

    由于每次代码都是在原有程序上修改,因此除了新建项目,不然一般会在学完后统一展示代码。 提示:具体项目创建流程和注意事项见 QT 学习笔记(一) 提示:具体项目准备工作和细节讲解见 QT 学习笔记(二) 生成一个新的项目,具体步骤过程见提示。 所谓的 GUI 界面,

    2024年02月08日
    浏览(36)
  • QT学习笔记(持续更新)

    1.自定义信号: 写在signals下,void,需要声明,不需要实现,可以有参数,可重载。 2.槽: 写在public下,void,需要声明,需要实现,可有参数,可发生重载。 3.断开信号: disconnect 4.emit: 使用emit发送信号 5.示例关键代码如下: 1.widget.cpp 2.widget.h 3.student.cpp 4.teacher.h和st

    2023年04月26日
    浏览(41)
  • Qt开发学习笔记02

    重写 mousePressEvent 方法 要在Qt中实现关机功能,你需要使用操作系统提供的相关函数或命令来执行关机操作。由于不同操作系统之间的关机方式可能有所不同,下面我将为你提供针对不同操作系统的示例代码。 Windows系统 也可使用下面方法 macOS系统 请注意,macOS系统需要使用

    2024年02月04日
    浏览(40)
  • Qt5学习笔记:Qt两个窗口(Widget)间传递数据

    0x01 原理介绍 Qt两个窗口之间传递数据实际上还是利用了信号与槽的概念来实现。 本质上讲,我们只需要实现A窗口发射信号,B窗口槽函数响应信号即可。 首先我们在A窗口的头文件中定义发射的信号: 然后在B窗口的头文件中定义槽函数: 最后我们需要将信号与槽连接起来,

    2024年02月13日
    浏览(46)
  • 【Qt学习笔记】☞窗口插入图片

    零基础Qt实现简易音视频播放器(包括可能出现的问题+解决方法)-QT文档类资源-CSDN文库         上边链接是利用Qt实现的简易音视频播放器,在主窗口开始页面使用汉字描述播放器名称,为了更美观的展示播放器主页面,可以在播放器的开始页面插入图片。 Qt中没有Image组件

    2024年02月06日
    浏览(44)
  • 角角の Qt学习笔记(一)

    目录 一、解决在创建新项目时遇到的几个问题 二、信号和槽(非自定义) 三、调用 UI 中的元素(比如按钮)   一、解决在创建新项目时遇到的几个问题          在新建项目时,我选择的构建系统为 CMake 。然后勾选了 Generate form ,勾选之后系统就会在新项目中会直接新建

    2024年02月13日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包