QT之嵌入外部第三方软件到本窗体中
一、前言
使用QT开发,有时需要调用一些外部程序,但是单独打开一个外部窗口有的场合很不合适,最好是嵌入到开发的QT程序界面中。还有就是自己开发的n个程序,一个主程序托n个子程序,为了方便管理将各个程序独立,但是运行还要整体去一起,也就需要将各个子程序嵌入到主程序预留的窗口处。
本文主要从以下几个方面进行总结:
- 将外部程序嵌入到主程序窗口中
- 外部程序与主程序通讯(暂无总结)
二、环境
qt5.7
window10
CPU是AMD Ryzen 7 4800U with Radeon Graphics 1.80 GHz,可能有关联
三、正文
将外部程序嵌入到主程序窗口中
方法千篇一律,在网上搜索有很多的方法,找到最合适的方法才是最重要的,这里我主要总结在我的电脑上能够正常运行的方法。
主程序名称mytool,子程序名称note,主程序创建一个widget给子程序预留,核心代码如下:
//启动外部程序QProcess *process1 = new QProcess(this);process1->setProcessChannelMode(QProcess::MergedChannels);//通道设置,可不加process1->start("../可执行程序/note.exe");//qApp->applicationDirPath()+"/note.exe"connect(this,&QObject::destroyed,[=](){process1->close();});//程序关闭时关闭子程序Sleep(500);//延时必须加,不加不好使HWND handle = FindWindow(nullptr, L"note");//使用process1->pid()不好使,只能用这种方式
// qDebug()<<(WId)handle<<(WId)process1->pid()<<process1->pid();if(handle != nullptr){//nullptrQWindow* externWindow = QWindow::fromWinId((WId)handle);QWidget* container_note = QWidget::createWindowContainer(externWindow, ui->widget_note);//存放外部窗口的Widget//将外部程序窗口嵌入到QWidget子类中显示container_note->setGeometry(0, 0, externWindow->width(), externWindow->height());//设置嵌入的窗口位置ui->btn_menu_2->setEnabled(true);//记事本加载成功}else{tray->showMessage("消息","加载失败!程序损坏或丢失请检查!",QSystemTrayIcon::MessageIcon::Warning,1000);//发送通知消息 //显示信息图标(NoIcon/Information/Warning/Critical)ui->btn_menu_2->setEnabled(false);//加载成功 失能按键}
重点1:Sleep延时函数必须得有,否则QProcess外部程序还没启动完全,是无法正常获取窗口ID的,也就嵌入不成功。
重点2:使用FindWindow函数返回数据类型定义为HWND,未使用WID,会失败,也没有使用process1.pid()获取ID,也会失败,目前测试只有这种方式获取外部窗口句柄好使。
重点3(本程序未使用):如果是调用其他第三方程序,不是自己开发的子程序,需要使用SPY++获取窗口句柄,网上随便就能下载,选择查找窗口,拖拽准心到目标窗口,就能看见返回值。延时时间需要根据外部第三方程序启动时间动态调整,很可能时间不够也不好使。
重点4:嵌入的窗口如果是固定尺寸,嵌入完毕后使用setGenmetry设置一下窗口位置和大小,否则会有大家常说的白边(PS吐槽一句,有的人写博客,就这一个小破功能就要把自己博客订阅花钱才能看,守着你的文章发霉去吧)。如果是不固定尺寸,可调节大小,将widget创建为私有全局对象,使用event重新根据预留的widget窗口大小动态调整嵌入的程序大小。
。h
pravite:
QWidget* container_note = nullptr; //存放外部窗口的Widget
。cpp
void Widget::resizeEvent(QResizeEvent *event) //外部窗口大小随动
{QWidget::resizeEvent(event);if (container_note != nullptr){container_note->resize(event->size());}
}
外部程序与主程序通讯(暂无总结)
内部通信也可以通过信号槽等绑定消息,也可以通过读取公共文本文件实现,这里暂时未使用到
四、结语
参考文章1
相关文章:

QT之嵌入外部第三方软件到本窗体中
一、前言 使用QT开发,有时需要调用一些外部程序,但是单独打开一个外部窗口有的场合很不合适,最好是嵌入到开发的QT程序界面中。还有就是自己开发的n个程序,一个主程序托n个子程序,为了方便管理将各个程序独立…...

解决GET请求中文乱码问题
解决GET请求中文乱码问题 1、乱码的根本原因2、解决方法方法一:修改Tomcat配置(推荐)方法二:使用URLEncoder和URLDecoder(不推荐用于GET请求乱码)方法三:String类编解码(不直接解决乱…...

弥合人类与人工智能的知识差距:AlphaZero 中的概念发现和迁移(1)
文章目录 一、摘要二、简介三、相关工作3.1 基于概念的解释3.2 强化学习中生成解释3.3 国际象棋与人工智能 四、什么是概念?五、发掘概念5.1 挖掘概念向量5.1.1 静态概念的概念约束5.1.2 动态概念的概念约束 5.2 过滤概念 一、摘要 人工智能(AIÿ…...
cpp的cbp
.cbp 文件是 Code::Blocks 的项目文件。Code::Blocks 是一个开源的跨平台集成开发环境(IDE),主要用于 C、C 以及 Fortran 编程。.cbp 文件包含有关项目的所有配置信息,包括文件路径、编译选项、链接器设置等。 以下是 .cbp 文件的…...
jQuery 选择器
jQuery 选择器 jQuery 是一个快速、小巧且功能丰富的 JavaScript 库。它使得 HTML 文档遍历和操作、事件处理、动画和 AJAX 等操作更加简单,适用于各种浏览器。jQuery 的核心特性之一是其强大的选择器引擎,它允许开发者通过 CSS 选择器语法轻松地选取和操作 DOM 元素。本文将…...

Linux系统编程-进程控制相关操作详解
进程(Process)是计算机科学中一个基本的概念,特别是在操作系统领域中非常重要。它指的是在系统中正在运行的一个程序的实例。每个进程都是系统资源分配的基本单位,是程序执行时的一个实例。以下是关于进程的详细解释: …...

分布式I/O从站的认知
为什么需要分布式I/O从站? 当PLC与控制机构距离过远时,远距离会带来信号干扰,分布式I/O从站只需要一个网络线缆连接。 ET200分布式I/O从站家族 体积紧凑、功能强大。 ET200SP ET200M ET200S ET200iSP ET200 AL ET200pro ET200 eco PN 通讯协议…...

【python】PyQt5顶层窗口相关操作API原理剖析,企业级应用实战分享
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...

流程图编辑框架LogicFlow-vue-ts和js
LogicFlow官网https://site.logic-flow.cn/LogicFlow 是一款流程图编辑框架,提供了一系列流程图交互、编辑所必需的功能和灵活的节点自定义、插件等拓展机制。LogicFlow支持前端研发自定义开发各种逻辑编排场景,如流程图、ER图、BPMN流程等。在工作审批配…...

goaccess分析json格式日志
一.安装使用yum安装,yum install goaccess 二.主要介绍格式问题 1.nginx日志格式如下: log_format main escapejson {"time_local":"$time_local", "remote_addr":"$remote_addr", "r…...
游戏AI的创造思路-技术基础-决策树(1)
决策树,是每个游戏人必须要掌握的游戏AI构建技术,难度小,速度快,结果直观,本篇将对决策树进行小小解读~~~~ 目录 1. 定义 2. 发展历史 3. 决策树的算法公式和函数 3.1. 信息增益(Information Gain&…...
OPenCV实现直方图均衡化----20240711
# 直方图均衡化import cv2 import numpy as np import matplotlib.pyplot as plt# 读取彩色图像 img = cv2.imread("./pictures/Lena.jpg")# 检查图像是否加载成功 if img is None:print("Could not open or find the i...

2023年全国大学生电子信息竞赛E题——自动追踪系统(stm32和openmv+普通舵机)完美解决第四问
当时做的时候,当时看别人开源的23年的题,感觉一头雾水。两个字没思路。确实只有做了才会有思路。我这里清晰的整理出来思路。 1.第一问的复位问题就是写一个函数,如果按键按下,就进入,再按下就退出 当然这个复位是写死…...

【UNI-APP】阿里NLS一句话听写typescript模块
阿里提供的demo代码都是javascript,自己捏个轮子。参考着自己写了一个阿里巴巴一句话听写Nls的typescript模块。VUE3的组合式API形式 startClient:开始听写,注意下一步要尽快开启识别和传数据,否则6秒后会关闭 startRecognition…...

Apache Spark分布式计算框架架构介绍
目录 一、概述 二、Apache Spark架构组件栈 2.1 概述 2.2 架构图 2.3 架构分层组件说明 2.3.1 支持数据源 2.3.2 调度运行模式 2.3.3 Spark Core核心 2.3.3.1 基础设施 2.3.3.2 存储系统 2.3.3.3 调度系统 2.3.3.4 计算引擎 2.3.4 生态组件 2.3.4.1 Spark SQL 2.…...

Visual Studio 2019 (VS2019) 中使用 CMake 配置 OpenCV 库(快捷版)
2024.07.11 测试有效 最近需要用一下 opencv 处理图像,简单配置了一下Cmake下的 opencv 库。 没有编译 opencv ,也不知道他们为什么要自己编译 opencv 。 一、下载并安装 OpenCV 1.前往 OpenCV 官方网站 下载适用于您的系统的 OpenCV 安装包。 2.点击直接…...

BUG解决:postman可以请求成功,但Python requests请求报403
目录 问题背景 问题定位 问题解决 问题背景 使用Python的requests库对接物联数据的接口之前一直正常运行,昨天突然请求不通了,通过进一步验证发现凡是使用代码调用接口就不通,而使用postman就能调通,请求参数啥的都没变。 接口…...
VScode常用快捷键
VScode介绍 VSCode(全称:Visual Studio Code)是一款由微软开发且跨平台的免费源代码编辑器。能够在windows、Linux、IOS等平台上运行,通过安装一些插件可以让这个编辑器变成一个编译器。与Visual Studio相比,它是免费…...

Day1每日编程题日记:数字统计、两个数组的交集、点击消除
前言:该篇用于记录自看。曾回看昨天的做题代码,竟然会觉得陌生,这竟然是我写的,细细读了一下,原来我当时是这么想的。因此我觉得记代码没有实际用处,重点是领悟了思想,这样子代码就在心中&#…...

ENSP实现防火墙区域策略与用户管理
目录 实验拓扑与要求编辑 交换机与防火墙接口的配置 交换机: 创建vlan 接口配置 防火墙配置及接口配置 防火墙IP地址配置 云配置编辑编辑编辑 在浏览器上使用https协议登陆防火墙,并操作 访问网址:https://192.168.100.1:844…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

图解JavaScript原型:原型链及其分析 | JavaScript图解
忽略该图的细节(如内存地址值没有用二进制) 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指向谁&…...

goreplay
1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...

理想汽车5月交付40856辆,同比增长16.7%
6月1日,理想汽车官方宣布,5月交付新车40856辆,同比增长16.7%。截至2025年5月31日,理想汽车历史累计交付量为1301531辆。 官方表示,理想L系列智能焕新版在5月正式发布,全系产品力有显著的提升,每…...

【threejs】每天一个小案例讲解:创建基本的3D场景
代码仓 GitHub - TiffanyHoo/three_practices: Learning three.js together! 可自行clone,无需安装依赖,直接liver-server运行/直接打开chapter01中的html文件 运行效果图 知识要点 核心三要素 场景(Scene) 使用 THREE.Scene(…...

深入理解 C++ 左值右值、std::move 与函数重载中的参数传递
在 C 编程中,左值和右值的概念以及std::move的使用,常常让开发者感到困惑。特别是在函数重载场景下,如何合理利用这些特性来优化代码性能、确保语义正确,更是一个值得深入探讨的话题。 在开始之前,先提出几个问题&…...