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窗口啦!!!!!

相关推荐
KWTXX9 小时前
制作qt小型交互音乐播放器
qt
我要升天!9 小时前
QT -- 初识
开发语言·qt
QT 小鲜肉11 小时前
【C++基础与提高】第一章:走进C++的世界——从零开始的编程之旅
开发语言·c++·笔记·qt
枫叶丹412 小时前
【Qt开发】布局管理器(五)-> QSpacerItem 控件
开发语言·数据库·c++·qt
qq_4017004112 小时前
Qt键盘组合
开发语言·qt
abcd_zjq13 小时前
VS2026+QT6.9+ONNX+OPENCV+YOLO11(目标检测)(详细注释)(附测试模型和图像)
c++·人工智能·qt·目标检测·计算机视觉·visual studio
QT 小鲜肉14 小时前
【Git、GitHub、Gitee】GitLab的概念、注册流程、远程仓库操作以及高级功能详解(超详细)
git·qt·gitee·gitlab·github
上去我就QWER15 小时前
Qt中的QShortcut:高效键盘快捷方式开发指南
开发语言·c++·qt
寻找华年的锦瑟20 小时前
Qt-视频播放器
开发语言·qt
IT阳晨。1 天前
【QT开发】交叉编译QT程序在ARMLinux平台上运行
c++·qt·交叉编译·armlinux·代码移植