Qt-窗口嵌套exe

2023-11-17

某些特殊场景,我们要在主程序中嵌套第三方程序。这样臃肿的设计好比,在乡村小楼里面建设一个商业广场,本人不是很喜欢。Qt的QProcess和QWindow可以为我们完成这样的任务,核心思路即

  1. QProcess启动第三方exe,获取进程ID
  2. winApi通过进程ID获取窗口句柄
  3. QWindow::fromWinId(WId id)创建window
  4. window代理的widget,即我们常见的QWidget

最好的是,第三方exe也是Qt开发的app。下面就是这样的情况

第三方exe

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    // OtherWidget inherit from QWidget
    OtherWidget w;
    w.setWindowFlags(w.windowFlags() | Qt::FramelessWindowHint);
    w.show();
    return a.exec();
}

如上,OtherWidget继承于QWidget ,如果继承QMainWindow,在嵌入后更改主窗口size时出现丢失。

嵌套

// 枚举窗口参数
typedef struct
{
    HWND hwndWindow; // 窗口句柄
    DWORD dwProcessID; // 进程ID
}EnumWindowsArg;

// 枚举窗口回调函数
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
    EnumWindowsArg *pArg = (EnumWindowsArg *)lParam;
    DWORD dwProcessID = 0;
    // 通过窗口句柄取得进程ID
    ::GetWindowThreadProcessId(hwnd, &dwProcessID);
    if (dwProcessID == pArg->dwProcessID)
    {
        pArg->hwndWindow = hwnd;
        // 找到了
        return FALSE;
    }
    // 没找到
    return TRUE;
}
// 通过进程ID获取窗口句柄
HWND GetWindowHwndByPID(DWORD dwProcessID)
{
    HWND hwndRet = NULL;
    EnumWindowsArg ewa;
    ewa.dwProcessID = dwProcessID;
    ewa.hwndWindow = NULL;
    EnumWindows(EnumWindowsProc, (LPARAM)&ewa);
    if (ewa.hwndWindow)
    {
        hwndRet = ewa.hwndWindow;
    }
    return hwndRet;
}
    QString cusExePath = "D:/VSpro/mainpro/x64/Debug/mainpro.exe";
    QString otherPath = "D:/QtProject/build-ModelDemo-Desktop_Qt_5_10_0_MSVC2015_64bit-Debug/debug/ModelDemo.exe";

    QStringList exePathList;
    exePathList << cusExePath << otherPath;

    for(int i = 0; i < exePathList.length(); i++){
        QProcess *process = new QProcess;
        QString path = exePathList.at(i);
        
        // 启动 第三方 exe, exepath 含有空格时,再次填充path即可
        if(path.contains(" ")){
            process->start(path, QStringList() << path);
        }
        else{
            process->start(path);
        }

        m_listProcess << process;

        qint64 proID = process->processId();

        HWND wid = NULL;

        do{
            wid = GetWindowHwndByPID(proID);
            if(wid){
                break;
            }
        }while(1);

        // window
        QWindow *window;
        window = QWindow::fromWinId((WId)wid);

        // proxyWidget
        QWidget *widget;
        widget = QWidget::createWindowContainer(window,this);

        ui->tabWidget->addTab(widget,QString::number(ui->tabWidget->count()));
    }

如上,我们开启了2个Qt APP exe,对于exePath含有空格的进行处理,结合winApi实现窗口句柄的获取,剩下的就很好办了。

退出

开启的第三方程序与主程序的依附问题,进程杀死等。对此的方法也很多

void MainWindow::closeEvent(QCloseEvent *event)
{
    for(auto &one : m_listProcess){
        one->close();
    }
}

当然,如果时其他开发的App,嵌套中会出现问题,所以还是说,小楼里面开商场,搞笑。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt-窗口嵌套exe 的相关文章

  • C++:头文件中全局函数的多重定义错误

    该函数是全局的 在头文件中定义 暂时地我想把它留在那里 头文件还构成一个具有内联函数的特定类 其中一个函数调用this全局函数 源文件不包含任何有问题的全局函数 有关错误原因的任何提示吗 如果有人感兴趣的话我可以发布代码 mainwindo
  • 如何搭建qtwayland?

    我花了一整天的时间尝试使用QtWayland Compositor 1 0在 Qt 创建者中 我已经遵循了从那里开始的所有步骤https wiki qt io QtWayland https wiki qt io QtWayland但我收到
  • 带 Qt 的菜单栏/系统托盘应用程序

    我是 Qt PyQt 的新手 我正在尝试制作一个应用程序 其功能将从菜单栏 系统托盘执行 这里展示了一个完美的例子 我找不到关于如何做到这一点的好资源 有人可以建议吗 Thanks 我认为您正在寻找与QMenu and QMainWindo
  • 另一个宏中的 Q_PROPERTY 宏

    如何放置Q PROPERTY另一个宏里面 辅助宏 define SimpleAllinOne member type public void Set member type arg member m member arg member ty
  • QPainter 性能高帧率

    我试图在 QPainter 中以 60fps 的速度显示视频 在 OpenGLwidget 中 我遇到一个问题 有时绘图花费的时间太长 并且在使用 QPainter 时发生下一个重绘事件 这会生成警告和随机崩溃 有几个问题 是否有一种 Qt
  • SWI-Prolog 与 C++ 接口的问题

    我试图让 SWI Prolog 与 C 很好地配合 现在束手无策 现在 在我开始准确解释我的问题是什么之前 我想首先说明我的项目是关于什么的以及我选择了哪些工具来开发解决方案 我的教授分配给我的任务是开发一个 GUI 程序 作为 SWI p
  • 如何为 qmlRegisterSingletonType 实现单例提供程序?

    我想在 QML 中使用 C 类作为 Singleton 实例 并认为我必须使用 qmlRegisterSingletonType 注册它们 此函数需要一个提供已注册 C 类的实例的函数 我在 Windows 上使用最新的 Qt 5 3 1
  • PyQt - 如何从给定的小部件获取顶级父级?

    给定的小部件如何访问它最旧的父级 即顶级小部件 我需要 showMinimized it 现在我正在使用 self parent parent parent showMinimized 但这似乎不是最好的方法 如果它移动了 我需要手动更改父
  • Qt5和QML:如何使用WebEngine Quick Nano浏览器自动输入用户名和密码

    我正在使用编写一个小应用程序Qt and QML使用 Qt 文档中的示例WebEngine Quick Nano 浏览器 https doc snapshots qt io qt5 5 9 qtwebengine webengine qui
  • 有没有办法向 QListView 添加部分?

    我正在使用 Qt5 2 和 C 来实现一个应用程序 需要显示一个列表 其中包含类似于下面的示例图像的部分 source ngo hung com http www ngo hung com files images contact list
  • 获取 QListView 中所有可见项目的简单方法

    我正在尝试使用 Qt Framework 开发一个图像库应用程序 应用程序从所选文件夹加载所有图像 并使用 QListView 控件显示这些图像 但现在我想通过仅加载用户可见的图像来减少内存消耗 由于没有直接函数来获取视图中的所有可见项目
  • 完全彻底卸载QT Creator

    问题 如何从 Linux 机器上卸载 QT Creator 我的 Debian Jessie 机器上的安装已损坏 我尝试过重新安装 修复等 但没有成功 建议我完全卸载 获取最新版本并重新安装 问题是我不确定如何执行此操作 每次我尝试时 QT
  • 将 jstring 转换为 QString

    我正在调用一个返回字符串的 Java 函数 QAndroidJniObject obj QAndroidJniObject callStaticObjectMethod
  • Qt:不完整类型和前向声明的使用无效

    我有一些误解 A h ifndef A H define A H include B h class A public B Q OBJECT public A endif A cpp include A h A A B ui gt blan
  • 如何doxygen注释Qt属性?

    我想将 Doxygen 注释附加到我的 Q PROPERTY 例如 song h class Song public QObject Q OBJECT private Q PROPERTY QString title READ title
  • 如何在 Qt 应用程序中嵌入 Python 解释器?

    有没有一种简单的方法可以将 Python 解释器嵌入到 Qt 应用程序中 如果可能的话 我希望有一个跨平台的解决方案 这就是目的PythonQt http pythonqt sourceforge net 它支持 Windows Linux
  • Qt 5.1.1 与 Visual Studio 2012 - 这些 QT 版本无法访问

    打开 Visual Studio 时出现此错误 我安装自http qt project org downloads http qt project org downloads 适用于 Windows 64 位的 Qt 5 1 1 VS 20
  • 如何将自定义 Qt 类型与 QML 信号一起使用?

    我在 Qt 5 2 qml 应用程序中创建了一个自定义类型 class Setting public QObject Q OBJECT Q PROPERTY QString key READ key WRITE setKey Q PROPE
  • Qt QML 数据模型似乎不适用于 C++

    我一直在使用中的示例http doc qt digia com 4 7 qdeclarativemodels html http doc qt digia com 4 7 qdeclarativemodels html这是 QML 声明性数
  • 使用 QGraphicsScene 实现流畅的动画

    我希望我的问题并不总是同样的问题 我有一个 QGraphicsScene 它的项目是一些 QGraphicsPixmap 我用一个计时器来移动它们 每秒 SetX 10 我设置 10是因为窗口大100 使用这个解决方案我的动画不流畅 我想我

随机推荐

  • python如何在xpath中传递2个参数或变量,定位下拉框列表值为新增值,li标签下拉列表值定位方法

    最近在写自动化脚本中遇到一种场景 需要定位下拉框数据的某个值 要先自动生成这个值 然后在下拉框中找到这个值 如下场景 我需要先用脚本自动生成一组手机号 用户名 然后再在这个下拉框中找到自动生成新添加的这组数据并选择它 思路 1 先定位一组固
  • os_mutex.c(全)

    无等待地获取互斥型信号量 OSMutexAccept OS EVENT pevent INT8U perr 创建互斥型信号量OS EVENT OSMutexCreate INT8U prio INT8U perr 删除信号量OS EVENT
  • 树莓派 mqtt

    Mosquitto是一款实现了消息推送协议 MQTT v3 1 的开源消息代理软件 sudo yum y install epel release sudo yum y install mosquitto 运行 sudo systemctl
  • mklink让网盘同步不同文件夹

    mklink简介 Linux 下有一个叫符号链接的东东 是 ln 这个链接命令 mklink 和 ln 的功能几乎一样 在xp系统下 junction命令要用微软开发的小程序 junction exe实现 从http live sysint
  • Chrome插件之CSDN浏览器助手,工欲善其事必先利其器

    1 下载与安装 第一步 官方下载地址 https plugin csdn net utm source chajian contest 1210 顾名思义 在Chrome浏览器上使用 所以 第二步 下载插件打开Chrome浏览器 第三步 输
  • 读取指定文件每行并运行cmd命令

    package com company import java io import java util ArrayList import java util List public class Main public static void
  • DevExpress网格控件(GridView)中增加下拉框和复选框

    本文主要介绍如何在GridControl网格中的每一行增加复选框 下拉框和多选下拉框 最终效果如下图所示 其中 测试模块 模块类型 从属 测试人 测试要求 备注等是数据库查询到的数据 操作步骤 一 添加控件 1 Winform窗口放置一个G
  • html移动端适配最优方法

    使用js来设置font size的方法最好 目前大部分成熟网站都采用这种方法 媒体查询可能会漏掉一些设备型号 并且比较繁琐 通过vw设置也比较方便 但是兼容性不好 js设置html的font size大小 document document
  • OpenSSL SSL_read: Connection was aborted, , errno 10053

    git遇到fatal unable to access https github com xxx xxx OpenSSL SSL read Connection was aborted errno 10053的问题 原因 Git默认限制推送
  • the desired address is beyond limit for this PLC

    问题描述 通过 Java连接西门子PLC S7 1200 学习中 出现错误 the desired address is beyond limit for this PLC 下面是测试代码 S7Connector connector S7C
  • zookeeper基本架构

    要全面了解zookeeper 首先我们得知道什么是zookeeper 能做什么 zookeeper是一个开源的分布式协调服务 主要用于数据订阅 发布 集群管理 配置管理 分布式锁 基本架构 zookeeper基本架构如下 zookeeper
  • angular input_可视化的 Angular 响应式编程

    现代化UI开发中 客户端 前端 一般会进行分层设计 实际用户可感知的 UI 作为顶层 称为视图 View 底层中独立于展示方式的数据结构称为模型 Model 而将两者进行关联的中间层部分 根据划分方式则有很多种定义 例如控制器 Contro
  • thinkPHP6.0入门笔记(五)——数据表字段排序

    thinkPHP6 0实现数据表字段排序 1 利用order方法简单实现 2 URL优化排序 1 利用order方法简单实现 一般情况下排序是交给前端来实现的 后端一般主要是实现数据库的增删查改 但是PHP中经常出现order字段 由于后端
  • cuBLAS【CUDA专门用来解决线性代数运算的库】

    cuBLAS是CUDA专门用来解决线性代数运算的库 分为三个级别 Lev1向量乘向量 Lev2矩阵乘向量 Lev3矩阵乘矩阵 此外 cuBLAS库还包含一些功能和状态结构函数 学习网站为 参考资料 四 cuBLAS与cuDNN
  • mysql 快照和binlog_mysql binlog二进制日志详解

    mysql binlog二进制日志详解 更新时间 2011年10月31日 23 13 00 作者 二进制日志包含了所有更新了数据或者已经潜在更新了数据 例如 没有匹配任何行的一个DELETE 的所有语句 基本概念 定义 二进制日志包含了所有
  • Tcl脚本学习

    包的创建和调用 在tcl脚本中 我们可以通过创建和调用包来增强代码的可复用性 创建包的步骤 1 在包脚本文件中 首先声明 package provide 标识当前文件提供了一个包 之后在该文件中完成包的内容 2 通过pkg mkIndex命
  • element table 表格实现上移、下移

    业务场景 有时候需要前端实现上移和下移功能 代码如下 根据交互形式 我这里是把第一条数据的上移按钮置灰不可点击 disabled scope index 0 最后一条数据下移按钮置灰不可点击 disabled scope index 1 t
  • DCDC输入输出电容的选择和计算(转载)

    文章转自MPS论坛 https forum monolithicpower cn t topic 2105 目前市面上的电容种类繁多 在为我们的电源电路选择输入输出电容的时候难免会挑花了眼 本文就来浅析一下如何选择输入输出电容及其相关的计算
  • 企业运维经典面试题汇总(5)

    1 git和svn 的区别 Git是分布式的 而Svn不是分布的 Git把内容按元数据方式存储 而SVN是按文件 Git没有一个全局版本号 而SVN有 目前为止这是跟SVN相比Git缺少的最大的一个特征 Git的内容的完整性要优于SVN G
  • Qt-窗口嵌套exe

    某些特殊场景 我们要在主程序中嵌套第三方程序 这样臃肿的设计好比 在乡村小楼里面建设一个商业广场 本人不是很喜欢 Qt的QProcess和QWindow可以为我们完成这样的任务 核心思路即 QProcess启动第三方exe 获取进程ID w