Qt调用外部exe并嵌入到Qt界面中(验证成功的成功)

2024-08-30 05:12

本文主要是介绍Qt调用外部exe并嵌入到Qt界面中(验证成功的成功),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://t.csdnimg.cn/CDsqQ
原作者在这里

本文章主要介绍如何用Qt调用其他应用的exe,并将窗口嵌入到Qt界面中。很多人查到的代码都能成功的将exe调用起来,但是嵌入不到窗口中。主要有两种原因,现在从头到尾的梳理一下。

1.主要代码
1.1启动exe

//包含头文件
#include <QProcess>
//启动软件
QProcess *m_process = new QProcess;
m_process->start("./test.exe");/此处参数写exe路径。启动后可适当的加点延时,等待exe完全启动
//或者调用m_process->waitForFinished(1000)等待程序执行完成

1.2获取exe窗口句柄,嵌入到主界面

WId m_wid = (WId)FindWindow(L"xxx",L"xxx");//第一个参数xxx为调用的exe的类名;第二个xxx参数为调用的exe的标题名。
QWindow *M_WINDOW = QWindow::fromWinId(m_wid);
M_WINDOW->setFlags(M_WINDOW->flags() | Qt::CustomizeWindowHint | Qt::WindowTitleHint);
QWidget *childWidget =QWidget::createWindowContainer(M_WINDOW,this);//创建新的widget
ui->horizontalLayout->addWidget(childWidget);//将widget窗口加入到主界面布局中
childWidget->show();
至此,代码部分已经完成了,但会有很多人会出现exe调用成功了,但是没有嵌入到Qt窗口中的现象。下面说一下解决此问题的办法,主要有两个原因。

启动exe程序在构造Qt主窗口界面之后,导致Qt没有找到外部exe句柄。

    解决办法: 将启动exe代码放在main函数构造主窗口类之前。具体如下:
int main(int argc, char *argv[])
{QApplication a(argc, argv);QProcess *m_process = new QProcess;m_process->start("./test.exe");MainWindow w;w.show();return a.exec();
}

3.未成功嵌入原因2
此步是嵌入成功与否的关键,也是大部分人未能成功嵌入的原因,就是获取窗口句柄时传的exe类名或者标题名称不对。尤其是类名,有的类名和我们自定义的类名或和我们理解的类名有很大出入。下面介绍一下如何准确的获取类名。

    利用spy++工具获取。具体步骤如下:1.打开VS,点击工具一栏。

在这里插入图片描述
2.点击Spy++,弹出窗口,点击查找窗口,即图中的小望远镜。
在这里插入图片描述
3.然后拖动类似光盘的图标到你想启动的外部exe窗口中,即可获取类名和标题名。 (以新建txt为例)
在这里插入图片描述
保证以上两点,在运行程序就可以成功的嵌入到自己 的Qt窗口啦!!!!!

这篇关于Qt调用外部exe并嵌入到Qt界面中(验证成功的成功)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1119889

相关文章

Python打包成exe常用的四种方法小结

《Python打包成exe常用的四种方法小结》本文主要介绍了Python打包成exe常用的四种方法,包括PyInstaller、cx_Freeze、Py2exe、Nuitka,文中通过示例代码介绍的非... 目录一.PyInstaller11.安装:2. PyInstaller常用参数下面是pyinstal

Java JDK Validation 注解解析与使用方法验证

《JavaJDKValidation注解解析与使用方法验证》JakartaValidation提供了一种声明式、标准化的方式来验证Java对象,与框架无关,可以方便地集成到各种Java应用中,... 目录核心概念1. 主要注解基本约束注解其他常用注解2. 核心接口使用方法1. 基本使用添加依赖 (Maven

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

python库pydantic数据验证和设置管理库的用途

《python库pydantic数据验证和设置管理库的用途》pydantic是一个用于数据验证和设置管理的Python库,它主要利用Python类型注解来定义数据模型的结构和验证规则,本文给大家介绍p... 目录主要特点和用途:Field数值验证参数总结pydantic 是一个让你能够 confidentl

使用Go调用第三方API的方法详解

《使用Go调用第三方API的方法详解》在现代应用开发中,调用第三方API是非常常见的场景,比如获取天气预报、翻译文本、发送短信等,Go作为一门高效并发的编程语言,拥有强大的标准库和丰富的第三方库,可以... 目录引言一、准备工作二、案例1:调用天气查询 API1. 注册并获取 API Key2. 代码实现3

在.NET项目中嵌入Python代码的实践指南

《在.NET项目中嵌入Python代码的实践指南》在现代开发中,.NET与Python的协作需求日益增长,从机器学习模型集成到科学计算,从脚本自动化到数据分析,然而,传统的解决方案(如HTTPAPI或... 目录一、CSnakes vs python.NET:为何选择 CSnakes?二、环境准备:从 Py

QT Creator配置Kit的实现示例

《QTCreator配置Kit的实现示例》本文主要介绍了使用Qt5.12.12与VS2022时,因MSVC编译器版本不匹配及WindowsSDK缺失导致配置错误的问题解决,感兴趣的可以了解一下... 目录0、背景:qt5.12.12+vs2022一、症状:二、原因:(可以跳过,直奔后面的解决方法)三、解决方

Java调用Python脚本实现HelloWorld的示例详解

《Java调用Python脚本实现HelloWorld的示例详解》作为程序员,我们经常会遇到需要在Java项目中调用Python脚本的场景,下面我们来看看如何从基础到进阶,一步步实现Java与Pyth... 目录一、环境准备二、基础调用:使用 Runtime.exec()2.1 实现步骤2.2 代码解析三、

Python如何调用另一个类的方法和属性

《Python如何调用另一个类的方法和属性》在Python面向对象编程中,类与类之间的交互是非常常见的场景,本文将详细介绍在Python中一个类如何调用另一个类的方法和属性,大家可以根据需要进行选择... 目录一、前言二、基本调用方式通过实例化调用通过类继承调用三、高级调用方式通过组合方式调用通过类方法/静

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制