将子进程(exe)界面嵌入到主进程(另一exe)界面中——Qt

devtools/2024/9/23 1:00:12/

前言

近期项目中,要将子进程界面嵌入到主进程中,双方都是自己开发的,之前有过研究,曾经写过一篇文章

将外部exe嵌入到界面中(Windows)——Qt_startf_useshowwindow-CSDN博客,如今发现不好用,界面是嵌入了,但是并没有按照要求的大小展示,通过了几种方法(布局、绝对位置)仍然行不通。

如何将一个进程(子进程)界面嵌入另一个进程界面

  • 方式一:在主进程中启动子进程,获取子进程的窗口句柄。
  • 方式二:如果子进程也是自己开发的,在启动子进程时,可以将主进程的容纳子进程界面的窗体句柄作为运行参数传入子进程,通过进程通讯的方式,进行控制。
    QStringList argl = a.arguments();qDebug() << argl;if (argl.size() <2){       return 0;}WId wid = WId(argl.at(1).toInt());QWindow* window = QWindow::fromWinId(wid);SubProcessWidget w;w.setProperty("_q_embedded_native_parent_handle", QVariant(wid));//设置属性,这句是必须的w.winId();//必须调用一次,生成winIdw.windowHandle()->setParent(window);//设置父窗口

如何控制大小位置

通过Windows API重置大小

之前都是通过Qt的方式对界面大小进行控制,失败了,后面查资料,发现有通过Windows API的方法(SetWindowPos)设置子进程界面的大小和位置的,所以就试了试,结果差强人意:可放大和还原,但是拖动主进程界面边框无法缩放,原因不清。

    qint64 pid = processStart();WId wid = getProcessWid(pid);if(wid!=0){m_wnd =(HWND)wid;SetParent(m_wnd,(HWND)ui->widget->winId());SetWindowPos(m_wnd, 0,  0, 0 ,ui->widget->width(), ui->widget->height(), SWP_NOZORDER);}
qint64 Widget::processStart()
{pro =new QProcess(this);pro->setProgram("programName");connect(pro,&QProcess::errorOccurred,this,&Widget::onErrorOccurred);connect(pro,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(onFinished(int,QProcess::ExitStatus)));connect(pro,&QProcess::started,this,&Widget::onStarted);connect(pro,&QProcess::stateChanged,this,&Widget::onStateChanged);pro->setCreateProcessArgumentsModifier([](QProcess::CreateProcessArguments *args){args->startupInfo->wShowWindow = SW_HIDE;args->startupInfo->dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;});pro->start();pro->waitForStarted();return pro->processId();}WId Widget::getProcessWid(qint64 pid)
{WId winId = NULL;while (true) {winId=(WId)FindWindowW(L"Qt5152dQWindowIcon",L"Form");if (winId != NULL){break;}}return winId;
}void Widget::resizeEvent(QResizeEvent *e)
{QWidget::resizeEvent(e);SetWindowPos(m_wnd, 0,  0, 0 ,ui->widget->width(), ui->widget->height(), SWP_NOZORDER);
}

子进程内部控制

由于子进程也是我开发的,所以可以通过TCP或者其他方式进行通讯,告诉子进程的大小和位置,在子进程中进行设置(setGeometry)。

结束语

纸上得来终觉浅,绝知此事要躬行。


http://www.ppmy.cn/devtools/35436.html

相关文章

MySQL 迁移到 Oracle 需要注意的问题

MySQL /Oracle 常见问题 1. VARCHAR/VARCHAR2/NVARCHAR 差异&#xff1a; MySQL 的 VARCHAR 是以字符为单位计算的&#xff0c;Oracle 的 VARCHAR 是 以字节为单位计算的&#xff0c;所以对中文的存储 Oracle 是 MySQL 的 2 倍 (GBK)和 3 倍(UTF8) 2. NULL 差异 A. MySQL…

「云渲染平台」3D模型渲染是CPU还是GPU?

​在数字艺术创作和工程设计这两个领域中&#xff0c;将三维模型转换成逼真的二维图像的过程被称为模型渲染&#xff0c;这是一种对计算资源要求极高的技术活动。在渲染三维模型时&#xff0c;CPU和GPU各自承担着不同的任务。现在&#xff0c;让我们来了解在模型渲染的过程中&a…

论文架构介绍

论文架构 背景&#xff1a;建议2段左右完成&#xff0c;字数控制在500左右为佳&#xff0c;对应子题目1过渡段&#xff1a;写150字左右的过渡段&#xff0c;承上启下&#xff0c;回答部分子题目2、3的要求正文实践部分&#xff1a;一般3-7个论点&#xff0c;根据题目的要求来看…

【一步一步了解Java系列】:探索Java基本类型转换的秘密

看到这句话的时候证明&#xff1a;此刻你我都在努力~ 加油陌生人~ 个人主页&#xff1a; Gu Gu Study ​​ 专栏&#xff1a;一步一步了解Java 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹。 如果喜欢能否点个赞支持一下&#…

奶爸预备 |《伯克毕生发展心理学.从0岁到青少年》 / (美) 劳拉·E. 伯克著——读书笔记

目录 引出第一篇 人的发展理论与研究第1章 历史、理论和研究方法 第二篇 发展的基础第2章 生物基础与环境基础第3章 孕期发育、分娩及新生儿 第三篇 婴儿期和学步期&#xff1a;0~2岁第4章 婴儿期和学步期的身体发育第5章 婴儿期和学步期的认知发展第6章 婴儿期和学步期的情绪与…

设计网页用什么软件

在设计网页时&#xff0c;可以使用多种软件来完成不同的任务。以下是一些常用的网页设计软件&#xff0c;以及它们的特点和用途。 1. Adobe Photoshop&#xff1a; Adobe Photoshop 是一款功能强大的图像编辑软件。在网页设计中&#xff0c;它常用于创建和编辑网页所需的图像、…

python爬虫(一)之 抓取极氪网站汽车文章

极氪汽车文章爬虫 闲来没事&#xff0c;将极氪网站的汽车文章吃干抹尽&#xff0c;全部抓取到本地&#xff0c;还是有点小小的难度。不能抓取太快&#xff0c;太快容易被封禁IP&#xff0c;不过就算被封了问题也不大&#xff0c;大不了重启路由器&#xff0c;然后你的IP里面又…

yolov5训练自己的数据集

训练自己的数据集是机器学习项目中的一个重要步骤&#xff0c;尤其是当你需要识别或定位特定的对象时。在使用YOLOv5进行训练之前&#xff0c;你需要准备好数据集、环境和一些配置文件。以下是使用YOLOv5训练自定义数据集的基本步骤&#xff1a; 1. 安装YOLOv5 首先&#xff…