QT之嵌入外部第三方软件到本窗体中

news2024/9/22 4:05:05

一、前言

使用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){//nullptr
        QWindow* 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.coloradmin.cn/o/1921741.html

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

相关文章

JMeter CSV 参数文件的使用教程

在 JMeter 测试过程中&#xff0c;合理地使用参数化技术是提高测试逼真度的关键步骤。本文将介绍如何通过 CSV 文件实现 JMeter 中的参数化。 设定 CSV 文件 首先&#xff0c;构建一个包含需要参数化数据的 CSV 文件。打开任何文本编辑器&#xff0c;输入希望模拟的用户数据&…

烟雾识别技术在火灾预防中的应用:思通数科大模型的力量

引言 火灾是导致生命财产损失的重大灾害之一。早期检测和快速响应是预防火灾和减少损失的关键。结合思通数科大模型的烟雾识别技术&#xff0c;为实时检测和精确定位烟雾来源提供了一种高效的解决方案。本文将探讨这一技术如何有效预防火灾并保障人员安全。 烟雾识别技术概述 …

Transformer——多头注意力机制(Pytorch)

1. 原理图 2. 代码 import torch import torch.nn as nnclass Multi_Head_Self_Attention(nn.Module):def __init__(self, embed_size, heads):super(Multi_Head_Self_Attention, self).__init__()self.embed_size embed_sizeself.heads headsself.head_dim embed_size //…

Shiro550反序列化漏洞分析

shiro搭建教程可以在网上自行搜索 漏洞发现 进入shiro界面后&#xff0c;burp抓包&#xff0c;选择remember me并进行登录。观察burp抓到的包 登录之后服务器返回一个Cookie Remember me 之后用户的访问都带着这个Cookie 这个Cookie很长&#xff0c;可能会在里面存在一定的信…

springboot增加过滤器后中文乱码

记录一下小问题 public class RepeatableHttpServletWrapper extends HttpServletRequestWrapper {private byte[] body;public RepeatableHttpServletWrapper(HttpServletRequest request) throws IOException {super(request);request.setCharacterEncoding("UTF-8&q…

数据建设实践之大数据平台(一)准备环境

大数据组件版本信息 zookeeper-3.5.7hadoop-3.3.5mysql-5.7.28apache-hive-3.1.3spark-3.3.1dataxapache-dolphinscheduler-3.1.9大数据技术架构 大数据组件部署规划 node101node102node103node104node105datax datax datax ZK ZK ZK RM RM NM

Git的命令使用与IDEA内置git图形化的使用

Git 简介 Git 是分布式版本控制系统&#xff0c;它可以帮助开发人员跟踪和管理代码的更改。Git 可以记录代码的历史记录&#xff0c;并允许您在不同版本之间切换。 通过历史记录可以查看&#xff1a; 进行了哪些更改&#xff1f;谁进行了更改&#xff1f;何时进行了更改&#…

nodejs模板引擎(二)

虽然Jade现在已经被更名为Pug&#xff0c;但它的使用方式并没有太大的改变。下面是如何在Node.js中使用Pug&#xff08;原Jade&#xff09;模板引擎的基本步骤&#xff1a; 1. 安装 Pug 首先&#xff0c;你需要安装Pug模块。在你的项目目录中&#xff0c;使用npm来安装&#…

gradle 和 java 版本对应关系

文章目录 gradle 和 java 版本对应关系原地址 gradle 和 java 版本对应关系 原地址 https://docs.gradle.org/current/userguide/compatibility.html#compatibility

超市暑期(7-8月)生鲜之蔬果商品及营销操作建议!

生鲜经营的思路现在越来越被重视&#xff0c;越来越做的更精细化&#xff0c;营销方法和手段越来越多&#xff0c;如何正确地运用好营销策略&#xff0c;如何做到这个季节的生鲜经营既能保持新鲜&#xff0c;又能保持盈利呢&#xff1f; 7-8月份蔬菜重点商品及季节性商品 叶菜…

无人驾驶大热,新能源汽车智能化中的算网支持

来源新华社&#xff1a;百度“萝卜快跑”全无人驾驶汽车行驶在路上 当前&#xff0c;新能源汽车产业数智化已成为全球汽车产业数字化转型的焦点。一方面&#xff0c;随着人工智能、大数据、云计算等技术的深度融合&#xff0c;新能源汽车在自动驾驶、智能互联、能源管理等方面…

从零设计一个神经网络:实现手写数字识别

前言 为了能够更好的理解神经网络&#xff0c;从手写数字识别这个小任务来逐层弄清楚神经网络的工作原理以及一般流程是非常合适的。 这篇文章就来手写完成一个数字识别的任务&#xff0c;来说明如何设计、实现并训练一个标准的前馈神经网络&#xff0c;以期对神经网络有一个…

AI编程助手-Tabnine的使用体验

文章目录 一&#xff0c;安装使用1&#xff0c;VSCode安装Tabnine插件2&#xff0c;使用 三&#xff0c;Tabnine的工作原理1&#xff0c;深度学习的力量2&#xff0c;注意事项&#xff1a;最大化Tabnine的效能 在编程的世界里&#xff0c;每一行代码都承载着创造者的智慧与汗水…

ubuntu安装YOLOV8环境

文章目录 前言 前言 ubuntu20.04 使用vmware虚拟机 1、安装python sudo apt-get install python3 python3-pip2&#xff0c;安装虚拟环境 sudo apt install python3.8-venv3&#xff0c;创建虚拟环境 python3 -m venv yolov8-env4&#xff0c;进入虚拟环境 source yolov8…

测试人必会 K8S 操作之 Dashboard

在云计算和微服务架构的时代&#xff0c;Kubernetes (K8S) 已成为管理容器化应用的标准。然而&#xff0c;对于许多新手来说&#xff0c;K8S 的操作和管理常常显得复杂而神秘。特别是&#xff0c;当你第一次接触 K8S Dashboard 时&#xff0c;你是否也感到有些无所适从&#xf…

十大CRM系统对比:选出最适合你的工具

本文将分享10款优质CRM系统&#xff1a;纷享销客、Zoho CRM、HubSpot、Salesforce、悟空CRM、销售易、Pipedrive、Oracle CRM、Insightly、SugarCRM。 在选择CRM系统时&#xff0c;很多企业主和管理者都面临着一个难题&#xff1a;市面上的品牌众多&#xff0c;到底哪个才是最…

《昇思25天学习打卡营第14天|SSD目标检测》

SSD&#xff08;Single Shot MultiBox Detector&#xff09;是一种用于目标检测的深度学习算法。它的设计旨在同时检测多个对象&#xff0c;并确定它们在图像中的位置和类别。与其他目标检测算法相比&#xff0c;SSD具有速度快和精度高的特点&#xff0c;在实时检测应用中非常受…

python 代码设计贪吃蛇

代码&#xff1a; # -*- codeing utf-8 -*- import tkinter as tk import random from tkinter import messageboxclass Snake:def __init__(self, master):self.master masterself.master.title("Snake")# 创建画布self.canvas tk.Canvas(self.master, width400,…

Centos忘记密码,重置root密码

Centos忘记密码&#xff0c;重置root密码 操作环境&#xff1a;Centos7.6 1、选择包含rescue的选项&#xff0c;按e进入编辑模式 首先&#xff0c;我们需要重启系统&#xff0c;进入开机引导菜单界面。在这里&#xff0c;我们可以看到系统的内核版本和启动参数等信息。我们需…

期权专题12:期权保证金和期权盈亏

目录 1. 期权保证金 1.1 计算逻辑 1.2 代码复现 1.3 实际案例 2. 期权盈亏 2.1 价格走势 2.2 计算公式 2.2.1 卖出期权 2.2.2 买入期权 免责声明&#xff1a;本文由作者参考相关资料&#xff0c;并结合自身实践和思考独立完成&#xff0c;对全文内容的准确性、完整性或…