Qt界面程序中嵌入其他可执行exe程序

背景:

本文实验环境 windows10,qt5.14

由于工作需要写了一个小的qt程序,然后在实际使用过程中还要和其他小工具来回切换,就想能不能把其他工具代码集成,最后发现对我来说还是直接在qt中嵌入其他的程序界面比较快,在网上搜索一下发现原理可行,但是没有找到完整的示例代码,对新手来说太痛苦了,所以记录一下过程,有需要的可以参考一二。

网上好多都是基于计算器的集成,但是win10中的计算器使用新的ui,不知道怎么玩就放弃了,就拿Windows中记事本练手吧。

一:新建项目

下图中由于没有用到画布,所有Generat form没有勾选。

代码很少,算是能走了一个完整的流程吧,需要其他功能的可以自行探究,对于我来说这点已经够用了,还吭哧了好久。代码都放在main函数中,附录在本文最后面,需要的可以复制。

遇到的问题:

我实际遇到如下错误:QThread: Destroyed while thread is still running,最后我通过把 QProcess m_process 变量设置为全局变量解决,或者new一个,当然我也不知道为啥报错,也有可能这样解决是碰巧解决,网上还有其他修复方法,下一次用上qt又不知道啥时候,原理不清楚~~~~。

代码中:WId wid = (WId)FindWindow(L"Notepad", NULL); Notepad是通过vs中spy.exe软件定位出来的。详见第四部分。若编译25行报错,先注释掉,然后按需调试。

二:测试结果

记事本嵌入qt程序中的时候标题隐藏了,好像和第25行代码无关,不知哪里设置的,知道大神期望告知。

三:测试代码

main.c中代码:

#include "mainwindow.h"

#include <QApplication>
#include <QDebug>
#include <QWidget>
#include <QProcess>
#include <QWindow>
#include <Windows.h>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget *w = new QWidget;
    QProcess m_process;
    m_process.start("C:/Windows/System32/notepad.exe",QStringList()<<""); // 1.电脑中记事本的路径

    if(!m_process.waitForFinished(3000))
    {
        qDebug()<<"--------";
    }

    WId wid = (WId)FindWindow(L"Notepad", NULL); // 2.需要嵌入的exe的界面的类名称
    QWindow *m_window = QWindow::fromWinId(wid);
    m_window->setFlags(m_window->flags() | Qt::CustomizeWindowHint | Qt::WindowTitleHint); //这边可以设置一下属性
    QWidget *m_widget  = QWidget::createWindowContainer(m_window, w);
    m_widget->setMinimumSize(500, 500);//窗口大小
    w->show();

    return a.exec();
}

四:定位窗口类的名称

spy.exe我以从vs中复制出来,需要可以直接下载使用,见文末。

下载链接:VisualStudio2019Tools-spy.exe_QT一个窗口显示其他软件-DOS文档类资源-CSDN下载

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值