有时候需要做框架集成的东西,需要把其他客户端像组件一样集成到一个客户端中,类似于一个软件集成的平台客户端,统一用一个中心管理的客户端做类似于控制面板一样的东西去调用不同的软件。此时就必须相应不同的点击图标的事件去嵌入到主界面里面。下面简单的对windows平台上面Qt的界面中嵌入系统自带的计算机程序做简单的说明。

一、首先是获取计算机程序的窗口类名称,只要利用的是VS中的Spy++工具,在vs菜单“工具”中打开之后如图所示。查找计算器的窗口句柄并获取到具体的类名。

CTRL+F,搜索句柄,获取到对应的类名。

二、通过windows系统函数获取软件进程窗口的句柄。

  1. #include<Windows.h>
  2. WId wid = (WId)FindWindow(L"CalcFrame", L"计算器");

接口中的第一个参数是类名称,也就是界面中“类”中有个标题,第二个参数是窗口名称,打开“常规”,填写标题,这个软件窗口名称为“计算器”,填入参数即可。

三、获取QWindow。

QWindow*m_window;

m_window= QWindow::fromWinId(wid);

m_window->setFlags(m_window->flags()|Qt::CustomizeWindowHint|Qt::WindowTitleHint); //这边可以设置一下属性

四、获取代理QWidget。

m_widget = QWidget::createWindowContainer(m_window, this->ui->widget); //第二个参数是作为window的父类,也可以用layout

具体的代码如下所示,代码放在了一个widget的构造函数中。

winId.h

  1. #pragma once
  2. #include <QtWidgets/QWidget>
  3. #include "ui_winId.h"
  4. class winId : public QWidget
  5. {
  6. Q_OBJECT
  7. public:
  8. winId(QWidget *parent = Q_NULLPTR);
  9. ~winId();
  10. private:
  11. Ui::winIdClass *ui;
  12. };

winId.cpp

  1. #include "stdafx.h"
  2. #include "winId.h"
  3. winId::winId(QWidget *parent)
  4. : QWidget(parent),ui(new Ui::winIdClass)
  5. {
  6. ui->setupUi(this);
  7. //创建进程
  8. //QString cmd="C:/Program Files/R/R-3.3.1/bin/x64/Rgui.exe";
  9. QString cmd = "C:/Windows/system32/calc.exe";
  10. STARTUPINFO si = { sizeof(si) };
  11. PROCESS_INFORMATION pi;
  12. si.dwFlags = STARTF_USESHOWWINDOW;
  13. si.wShowWindow = true;
  14. bool bRet = CreateProcess(
  15. NULL,
  16. (LPWSTR)cmd.toStdWString().c_str(),
  17. NULL,
  18. NULL,
  19. FALSE,
  20. CREATE_NEW_CONSOLE,
  21. NULL,
  22. NULL, &si, &pi);
  23. Sleep(5000);
  24. WId wid = (WId)FindWindow(L"CalcFrame", L"计算器");
  25. //WId wid = (WId)FindWindow(L"Rgui Workspace",NULL);
  26. QWindow *m_window;
  27. m_window = QWindow::fromWinId(wid);
  28. m_window->setFlags(m_window->flags() | Qt::CustomizeWindowHint | Qt::WindowTitleHint); //
  29. QWidget *m_widget;
  30. m_widget = QWidget::createWindowContainer(m_window, this->ui->widget);
  31. m_widget->setMinimumSize(400, 300);
  32. }
  33. winId::~winId()
  34. {
  35. delete ui;
  36. }

最后的运行效果如下图。

另外在git上面也有一个例子,具体路径为:https://github.com/snasoft/qt-windows-composition-example

http://blog.csdn.net/u013394556/article/details/78534833

外部进程嵌入到Qt进程界面(使用QWindow::fromWinId)的更多相关文章

  1. Qt 进程和线程之一:运行一个进程和进程间通信

    Qt提供了对进程和线程的支持.本节讲述了怎样在Qt应用程序中启动一个进程,以及几种常用的进程间通信方法.如果对进程和线程的概念不是很了解,可以看我的另一篇博客:[多进程和多线程的概念. 设计应用程序时 ...

  2. Qt启动子进程,子进程关闭时通知主进程,实现主进程对子进程的管理

    自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: https://www.cnblogs.com/bclshuai/p/11380657.html 1.需求描述  Qt主进程启动 ...

  3. 对《将Unreal4打包后的工程嵌入到Qt或者桌面中》一文的补充

    在上一文中本人尝试将Ue4嵌入到Qt中,但依然有一些问题没有去尝试解决.今天因为帮助知乎专栏作者@大钊的关系,顺便进行补完. 2018.7.18更新: 正好在参加杭州UnrealCircle的时候见到 ...

  4. (七) 一起学 Unix 环境高级编程(APUE) 之 进程关系 和 守护进程

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  5. Linux进程学习(孤儿进程和守护进程)

    孤儿进程和守护进程 通过前面的学习我们了解了如何通过fork()函数和vfork()函数来创建一个进程.现在 我们继续深入来学习两个特殊的进程:孤儿进程和守护进程 一.孤儿进程 1.什么是 孤儿进程如 ...

  6. 基于toyix的进程和轻权进程的学习

    我们在平时的计算机课上学习过进程,知道程序的执行的背后其实就是进程在进行一些操作.大家都知道打开windows的任务管理器可以看到正在运行的进程,当程序卡死时,可以在任务管理器里强制关闭相关程序的进程 ...

  7. linux下的守护进程及会话、进程组

    守护进程.会话.进程组网上有许多不错的资料.我也是网上搜罗了一堆,加上自己的理解.不敢说原创,只是写在这怕自己忘记罢了.才疏学浅,难免有错误,欢迎大家指正.下面这篇写很不错,大家可以去看看:http: ...

  8. Linux下0号进程的前世(init_task进程)今生(idle进程)----Linux进程的管理与调度(五)【转】

    前言 Linux下有3个特殊的进程,idle进程(PID = 0), init进程(PID = 1)和kthreadd(PID = 2) idle进程由系统自动创建, 运行在内核态 idle进程其pi ...

  9. linux的0号进程和1号进程

    linux的 0号进程 和 1 号进程 Linux下有3个特殊的进程,idle进程(PID = 0), init进程(PID = 1)和kthreadd(PID = 2) * idle进程由系统自动创 ...

随机推荐

  1. 8、hzk16的介绍以及简单的使用方法

    HZK16 字库是符合GB2312标准的16×16点阵字库,HZK16的GB2312-80支持的汉字有6763个,符号682个.其中一级汉字有3755个,按 声序排列,二级汉字有3008个,按偏旁部首 ...

  2. egreat a5 遥控器 AK82无线遥控器

    [爆炸性消息]购买亿格瑞 A5 送 AK82 遥控器!! [复制链接] http://bbs.egreatworld.com/forum.php?mod=viewthread&tid=315 ...

  3. 【C++竞赛 G】Lines

    Time Limit: 3s Memory Limit: 64MB 问题描述 Ljr has several lines. The lines are covered on the X axis. L ...

  4. USB 3.0规范中译本 第2章 术语及缩略语

    本文为CoryXie原创译文,转载及有任何问题请联系cory.xie#gmail.com. 本章列出并定义本规范通篇将使用的术语及缩略语. 术语/略缩语 定义 ACK(确认包) 表示积极肯定的握手包. ...

  5. 关于 rman duplicate from active database 搭建dataguard--系列一

    关于 rman duplicate from active database.详细操作实际为backup as copy .会拷贝非常多空块.对于那些数据库数据文件超过100G的都不是非常建议用:在非 ...

  6. CSDN编程挑战——《交替字符串》

    交替字符串 题目详情: 假设字符串str3可以由str1和str2中的字符按顺序交替形成,那么称str3为str1和str2的交替字符串.比如str1="abc",str2=&qu ...

  7. php定时任务(自己)

    php定时任务(自己) 一.总结 一句话总结:可用php.exe连接php文件和bat文件,bat文件在计划任务中可以设置定时执行, 二. 1.php 2.bat E: "D:\softwa ...

  8. DOM中Event 对象如何使用

    DOM中Event 对象如何使用 一.总结 一句话总结: 1.将event作为参数传递进来,然后就可以调用event对象的各种属性和方法了. <body onmousedown="wh ...

  9. Xcode7 不能使用http网络请求问题解决

    最近使用Xcode 7.0 写代码,发送网路请求提示:  App Transport Security has blocked a cleartext HTTP (http://) resource ...

  10. UIlabel文字大小自适应label宽度变大变小

    label.adjustsFontSizeToFitWidth = YES;   //默认no