QProcess类实现将子进程的窗口嵌入的主进程中

 在主进程中创建子进程,子进程也是通过qt新建的qwidget窗口的应用程序.

bool CncOpWindows::LoadVisionMeasureApp()
{QString cmd= QCoreApplication::applicationDirPath();int iCamAppType = 0;switch (iCamAppType){case 0:cmd += "/ImageGrab.exe";//子程序执行文件地址break;case 5:cmd += "/MeasureVM.exe";//子程序执行文件地址break;}QStringList argList;
//将子进程的窗口嵌入stackedWidget对象中,所以将父对象的id传给子进程.argList << QString::number(ui->stackedWidget_sub->winId());//把父窗口的id给子进程传递过去m_pProcessVM = new QProcess(this);//使用进程运行子进程窗口connect(m_pProcessVM, &QProcess::readyReadStandardError, this, &CncOpWindows::slotCreateWaitingVM);//等待子进程窗口把自身的winId传递过来,在子进程中需要做对应的动作
//响应子进程结束的消息,查询子进程是否正常结束.connect(m_pProcessVM, qOverload<int, QProcess::ExitStatus>(&QProcess::finished), this, qOverload<int , QProcess::ExitStatus>(&CncOpWindows::slotFinishedProcessVM));//connect(m_pProcessVM, &QProcess::readyRead, this, &CncOpWindows::slotReadProcessVM);//开启子进程程序m_pProcessVM->start(cmd, argList);
//等待2000ms,返回false说明启动子进程失败.return m_pProcessVM->waitForStarted(2000);
}

 其他槽函数,及析构时的函数

void CncOpWindows::slotCreateWaitingVM()
{
//子进程返回的错误码,为子进程的窗口idquint64 winId = m_pProcessVM->readAllStandardError().toLongLong();
//根据子进程的窗口id, 构造一个QWindow对象指针.m_ChildVMWin = QWindow::fromWinId(winId);if (m_ChildVMWin){
//通过这个QWindow对象指针,通过QWidget::createWindowContainer的静态函数,封装到这个Qwidget容器中.m_WidgetVMProcess = QWidget::createWindowContainer(m_ChildVMWin);//获取一个子进程窗口的widget//将这个QWidget对象指针,添加到stackedWidget_sub中.ui->stackedWidget_sub->addWidget(m_WidgetVMProcess);//这里是可以使用布局器管理子进程窗口的,不管理的话就在坐标0,0处}}void CncOpWindows::slotFinishedProcessVM(int exitCode, QProcess::ExitStatus exitStatus)
{
//进程结束时的状态判断qInfo() << "ImageGrab.exe quit"<<"[exitCode="<< exitCode << "ExitStatus=" << exitStatus << "]";//if (exitStatus== QProcess::NormalExit)//{//	//正常退出//}//else//{//	//非正常退出//}}//这个函数一定要放到析构函数里面,不能放到closeevent事件中处理.会导致提前结束进程.
void CncOpWindows::CloseVisionMeasureApp()
{//关闭当前视觉测量进程if (m_pProcessVM){////关键点,必须将嵌入的QWindow设置为没有父对象,在调用退出指令就正常了if (m_ChildVMWin){m_ChildVMWin->setParent(nullptr);}//正常退出程序terminate 发送一个close消息到顶层窗口.m_pProcessVM->terminate();//等待结束不能省,bool bFinish=m_pProcessVM->waitForFinished(5000);if (!bFinish){//非正常退出qInfo() << "ImageGrab.exe crash quit";}}}

子进程中相应处理:

在main函数中添加如下

int main(int argc, char *argv[])
{QApplication a(argc, argv);ImageGrab w;if (argc >1){WId wid = WId(QString(argv[1]).toInt());//通过参数列表获取父进程窗口的WinIdQWindow* window = QWindow::fromWinId(wid);//获取父进程窗口w.setProperty("_q_embedded_native_parent_handle", QVariant(wid));//设置属性,这句是必须的w.winId();//必须调用一次,生成winIdw.windowHandle()->setParent(window);//设置父窗口//关键代码,触发错误之后,主进程能够响应fprintf(stderr, "%lld", (qint64)w.winId());//写入标准错误输出,stderr能立即输出,stdout则不行w.m_bSubProcess = true;}else{w.m_bSubProcess = false;}w.show();return a.exec();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/19790.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java知识大纲

一、基础 (一) Java的应用范围和相关组件 (二)搭建开发环境 (三)类文件定义 (四)编写第一个程序 (五)编译和运行 (六)变量定义和使用 (七)字符串的定义和使用 (八)变量类型转换 (九)静态变量 (十)基本运算、逻辑运算、位运算 (十一)流程结构(条件&#xff0c;循环&a…

华为官网的自助申诉

代码&#xff1a;如下 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>Document</title> …

MatLab命令行常用命令记录

文章目录 MatLab常用命令行MatLab常用按键标点说明 MatLab常用命令行 Matlab常用命令用来管理目录、命令、函数、变量、工作区、文件及窗口。常用命令如下表 命令作用cd显示或改变当前文件夹load加载指定文件的变量dir显示当前文件夹或指定目录下的文件diary日志文件命令type…

Facebook会话过期是什么情况?如何解决?

如果你点开这篇文章&#xff0c;可能你曾经遇到过Facebook会话过期的错误。无论你是在抓取Facebook数据还是只是浏览动态&#xff0c;看到这个错误消息都会让人很不爽。但别担心&#xff0c;我们将会分享解决Facebook会话过期错误的最佳方法&#xff0c;这样你就可以迅速修复问…

TemuTHunt使用简单介绍

数据列表 详情 列表及详情 数据监控 ------------------------------------------------华丽的分割线------------------------------------ 数据列表 商品详情 更多功能及分析报表 是不是很好用。

算法学习笔记(7.3)-贪心算法(最大切分乘问题)

目录 ##问题描述 ##问题思考 ##贪心策略确定 ##代码实现 ##时间复杂度 ##正确性验证 ##问题描述 给定一个正整数 &#x1d45b; &#xff0c;将其切分为至少两个正整数的和&#xff0c;求切分后所有整数的乘积最大是多少 ##问题思考 假设我们将 &#x1d45b; 切分为 &…

SQL入门教程----基础知识

SQL&#xff08;Structured Query Language&#xff09;是一种用于管理和操作关系数据库的标准语言。它主要用于执行查询、插入、更新和删除数据库中的数据。以下是一个SQL入门教程&#xff0c;涵盖基础概念、基本操作和一些常用的SQL命令。 1. 基本概念 数据库&#xff1a;存…

字符串转换为字节数组、16进制转换为base64、base64转换为字符串数组、base64转换为16进制(微信小程序)

1、字符串转换为字节数组 // 字符串转为字节数组 function stringToByteArray(str) {var array new Uint8Array(str.length);for (var i 0; i < str.length; i) {array[i] str.charCodeAt(i);}return array; } 2、16进制转换为base64 // 16进制转换为base64 function H…

linux开发之设备树六、linux下pinctrl子系统管理设置pin管脚的复用功能(一般原厂提供)

客户端的编写格式是固定的&#xff0c;不管哪家原厂的处理器&#xff0c;格式都是一样的 对于服务端部分是原厂提供&#xff0c;各个芯片肯定就不一样了&#xff0c;主要在于编写的格式不同 pinctrl客户端写法 使用pinctrl设置管脚复用 在kernel/arch/arm64/boot/dts/rockchi…

清风雅致·林曦老师的中国画美育直播课 你想了解的都在这里

大家期待已久的《清风雅致林曦老师的中国画美育直播课》开启报名啦~这个夏天&#xff0c;林曦老师将带你画完十幅重要的册页图&#xff0c;明代杜琼的《南村别墅图》。在此期间&#xff0c;暄桐教室除了收到了大家的“心心念念”和“满怀期待”&#xff0c;还有一连串“小问号”…

将 cuda kernel 编译成 ptx 和 rocm的hip asm

1&#xff0c;cuda 源码编译 cuda_a_one.cu __global__ void NNNNNVVVVV_one(int *A) {A[333] 777; }编译命令&#xff1a; %.ptx: %.cu nvcc -archsm_70 -ptx $< -o $ 生成的结果&#xff1a; 2, hip 源码编译 hip_a_one.hip__global__ void AAAAAMMMMM_one(int *A…

Redis之持久化、集群

1. Redis持久化 Redis为什么需要持久化?因为Redis的数据我们都知道是存放在内存中的&#xff0c;那么每次关闭或者机器断电&#xff0c;我们的数据旧丢失了。 因此&#xff0c;Redis如果想要被别人使用&#xff0c;这个问题就需要解决&#xff0c;怎么解决呢?就是说我们的数…

安全风险 - 检测设备是否为模拟器

在很多安全机构的检测中&#xff0c;关于模拟器的运行环境一般也会做监听处理&#xff0c;有的可能允许执行但是会提示用户&#xff0c;有的可能直接禁止在模拟器上运行我方APP 如何判断当前 app 是运行在Android真机&#xff0c;还是运行在模拟器? 可能做 Framework 的朋友思…

广告联盟如何实现

在互联网时代&#xff0c;各种广告形式无处不在&#xff0c;无论是在社交媒体、网站还是APP上&#xff0c;广告无处不在。然而&#xff0c;广告对于一些人来说并不只是一种干扰&#xff0c;还可以是一种赚钱方式。下载广告联盟看广告能赚钱吗?这是一个很有趣的问题&#xff0c…

玩机进阶教程------修改gpt.bin分区表地址段 完全屏蔽系统更新 fast刷写分区表 操作步骤解析【二】

上期博文简单说明了分区表的基本常识。我们在有些环境中需要屏蔽手机的系统更新选项。除了以前博文中说明的修改系统更新下载文件夹的方法。还可以通过修改分区表类达到目的。在一些辅助维修工具上面带修改分区表功能。修改后效果为屏蔽系统更新和可以恢复出厂。原则上不深刷都…

宝塔面板搭建thinkphp(fastadmin)项目注意事项

thinkphp宝塔面板部署时可能遇到的问题总结 设置静态伪静态为thinkphp模版数据库要同步代码要全部上传,不要拉下重要文件,原有的ignore文件没有上传thinkphp和vendor文件夹,简单处理的话一起放入git库,push上去权限问题会导致打不开,注意要用www用户775权限fastadmin项目php需…

短剧源码系统深层次解析:技术架构与实现

短剧源码系统作为短视频内容生产与分发的核心技术&#xff0c;其技术实现对于开发者和运营者至关重要。本文将深入探讨短剧源码系统的关键技术架构&#xff0c;特别是前端框架uni-app和Vue&#xff0c;以及后端框架ThinkPHP5和Workerman的应用。 前端框架&#xff1a;uni-app与…

怎么把图片大小调小?在线改图片大小的方法

怎么把比较大的图片压缩变小呢&#xff1f;在使用图片的时候&#xff0c;比较常见的一个问题就是图片太大导致无法正常上传&#xff0c;需要将图片处理到合适的大小之后&#xff0c;才可以正常在网上上传。现在一般调整图片大小多会通过使用在线改图片大小的在线工具来处理&…

SpringBoot集成JOOQ加Mybatis-plus使用@Slf4j日志

遇到个问题记录下&#xff0c;就是SpringBoot使用Mybatis和Mybatis-plus时可以正常打印日志&#xff0c;但是JOOQ的操作日志确打印不出来&#xff1f; 下面的解决方法就是将JOOQ的日志单独配置出来&#xff0c;直接给你们配置吧&#xff01; 在项目的resources目录下创建日志…

ubuntu 20.04上docker 使用gpu

要在Docker容器中使用GPU,你需要确保系统上已经安装了正确的NVIDIA驱动程序,并且安装了NVIDIA Container Toolkit。以下是详细的步骤: 1. 安装NVIDIA驱动程序 确保你的系统上已经安装了适当版本的NVIDIA驱动程序。你可以通过运行以下命令来检查驱动程序是否正确安装: nv…