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

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

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

相关文章

安全防御---防火墙实验1

安全防御—防火墙实验1 一、实验拓扑与要求 要求&#xff1a; 1、DMZ区内的服务器&#xff0c;办公区仅能在办公时间内&#xff08;9&#xff1a;00-18:00)可以访问&#xff0c;生产区的设备全天可以访问 2、生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 …

华为手机联系人不见了怎么恢复?3个解决方案

华为手机联系人列表就像是我们精心编织的社交网络之网。然而&#xff0c;有时&#xff0c;这张网可能会因为各种原因而意外破损&#xff0c;联系人信息消失得无影无踪&#xff0c;让我们陷入“人脉孤岛”的困境。华为手机联系人不见了怎么恢复&#xff1f;别担心&#xff0c;我…

计算机网络——数据链路层(以太网)

目录 局域网的数据链路层 局域网可按照网络拓扑分类 局域网与共享信道 以太网的两个主要标准 适配器与mac地址 适配器的组成与运作 MAC地址 MAC地址的详细介绍 局域网的mac地址格式 mac地址的发送顺序 单播、多播&#xff0c;广播mac地址 mac帧 如何取用…

【面试八股总结】线程基本概念,线程、进程和协程区别,线程实现

一、什么是线程&#xff1f; 线程是“轻量级进程”&#xff0c;是进程中的⼀个实体&#xff0c;是程序执⾏的最小单元&#xff0c;也是被系统独立调度和分配的基本单位。 线程是进程当中的⼀条执行流程&#xff0c;同⼀个进程内多个线程之间可以共享代码段、数据段、打开的文件…

解决:Flink向kafka写数据使用Producer精准一次(EXACTLY_ONCE)异常

在使用flink向kafka写入数据报错&#xff1a;Caused by: org.apache.kafka.common.KafkaException: Unexpected error in InitProducerIdResponse; The transaction timeout is larger than the maximum value allowed by the broker (as configured by transaction.max.timeou…

【C++】哈希表的模拟实现及 unordered_set 和 unorderded_map 的封装

目录 前言一、哈希表的模拟实现1.1 哈希表的改造1.1.1 模板参数列表的改造1.1.2 增加迭代器操作 1.2 哈希表的模拟实现1.2.1 哈希表中仿函数的实现1.2.2 哈希表中节点类的实现1.2.3 哈希表中迭代器类的实现1.2.4 哈希表中构造函数、析构函数和 Clear() 函数的实现1.2.5 哈希表中…

[笔试训练](三十六)106:提取不重复的整数107:哈夫曼编码108:abb

目录 106:提取不重复的整数 107:哈夫曼编码 108:abb 106:提取不重复的整数 题目链接:提取不重复的整数_牛客题霸_牛客网 (nowcoder.com) 题目: ​ 题解: #include <iostream> #include <string> using namespace std; int n0; int cnt[10]; int ret0; int mai…

【pytorch18】Logistic Regression

回忆线性回归 for continuous:y xwbfor probability output:yσ(xwb) σ:sigmoid or logistic 线性回归是简单的线性模型&#xff0c;输入是x&#xff0c;网络参数是w和b&#xff0c;输出是连续的y的值 如何把它转化为分类问题?加了sigmoid函数&#xff0c;输出的值不再是…

Python精神病算法和自我认知异类数学模型

&#x1f3af;要点 &#x1f3af;空间不确定性和动态相互作用自我认知异类模型 | &#x1f3af;精神病神经元算法推理 | &#x1f3af;集体信念催化个人行动力数学模型 | &#x1f3af;物种基因进化关系网络算法 | &#x1f3af;电路噪声低功耗容错解码算法 &#x1f4dc;和-…

动手学深度学习(Pytorch版)代码实践 -循环神经网络-55循环神经网络的从零开始实现和简洁实现

55循环神经网络的实现 1.从零开始实现 import math import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2l import matplotlib.pyplot as plt import liliPytorch as lp# 读取H.G.Wells的时光机器数据集 batch_size, num_ste…

C语言中的数组:掌握数据的有序集合【一维数组,二维数组,字符串数组,直方图打印,计算全排列,字符数组常用函数】

目录 C语言中的数组&#xff1a;掌握数据的有序集合【一维数组&#xff0c;二维数组&#xff0c;字符串数组】一维数组一维数组的创建数组的七种初始化完全初始化&#xff1a;部分初始化&#xff1a;字符数组的初始化&#xff1a;自动初始化为0&#xff1a;使用memset函数初始化…

『大模型笔记』GraphRAG:用于复杂数据发现的新工具现已在GitHub上发布

GraphRAG:用于复杂数据发现的新工具现已在GitHub上发布 文章目录 一. GraphRAG:用于复杂数据发现的新工具现已在GitHub上发布1. 评估和结果2. 研究见解和未来方向二. 参考文献一. GraphRAG:用于复杂数据发现的新工具现已在GitHub上发布 下载 GraphRAG今年早些时候,我们介绍…

博客建站3 - 购买域名

1. 本网站的系统架构2. 选择域名 2.1. 确定域名关键词2.2. 保持简洁易记2.3. 检查域名可用性 3. 域名注册商 3.1. 海外的提供商 3.1.1. GoDaddy3.1.2. Namecheap3.1.3. Google Domains 3.2. 国内的提供商 3.2.1. 阿里云&#xff08;Alibaba Cloud&#xff09;3.2.2. 腾讯云&…

0502STM32EXTI中断项目代码实现

STM32EXTI中断函数代码实现 对射式红外传感器&旋转编码器计次配置外部中断的步骤&#xff1a;AFIO相关函数&GPIO的一个函数EXTI相关函数代码NVIC中断函数启动文件里的中断函数名字中断编程的建议&#xff1a; 对射式红外传感器&旋转编码器计次 一般一个模块要写的…

SpringBoot:SpringBoot中如何实现对Http接口进行监控

一、前言 Spring Boot Actuator是Spring Boot提供的一个模块&#xff0c;用于监控和管理Spring Boot应用程序的运行时信息。它提供了一组监控端点&#xff08;endpoints&#xff09;&#xff0c;用于获取应用程序的健康状态、性能指标、配置信息等&#xff0c;并支持通过 HTTP …

windows下使用编译opencv在qt中使用

记录一下&#xff1a;在windows下qt使用opencv 1、涉及需要下载的软件 CMake 下载地址opecnv下载地址mingw(需要配置环境变量) 这个在下载qt的时候可以直接安装一般在qt的安装路径下的tool里比如我的安装路径 (C:\zz\ProgramFiles\QT5.12\Tools\mingw730_64) 2、在安装好CMake…

ChatGPT对话:Scratch编程中一个单词,如balloon,每个字母行为一致,如何优化编程

【编者按】balloon 7个字母具有相同的行为&#xff0c;根据ChatGPT提供的方法&#xff0c;优化了代码&#xff0c;方便代码维护与复用。初学者可以使用7个字母精灵&#xff0c;复制代码到不同精灵&#xff0c;也能完成这个功能&#xff0c;但不是优化方法&#xff0c;也没有提高…

ENSP软件中DHCP的相关配置以及终端通过域名访问服务器

新建拓扑 配置路由器网关IP 设备配置命令&#xff1a;<Huawei> Huawei部分为设备名 <>代表当下所在的模式&#xff0c;不同模式下具有不同的配置权限<Huawei> 第一级模式&#xff0c;最低级模式 查看所有参数<Huawei>system-view 键入系统视图…

Python中的null是什么?

在知乎上遇到一个问题&#xff0c;说&#xff1a;计算机中的「null」怎么读&#xff1f; null正确的发音是/n^l/&#xff0c;有点类似四声‘纳儿’&#xff0c;在计算机中null是一种类型&#xff0c;代表空字符&#xff0c;没有与任何一个值绑定并且存储空间也没有存储值。 P…

STM32的独立看门狗详解

目录 1.独立看门狗是什么&#xff1f; 2.独立看门狗的作用 3.独立看门狗的实现原理 4.独立看门狗用到的寄存器 4.1 IWDG_KR &#xff08;关键字计时器&#xff09; 4.2 IWDG_PR&#xff08;预分频寄存器&#xff09; 4.3 IWDG_RLR&#xff08;重装载寄存器&#xff09…