外部进程嵌入到Qt进程界面(使用QWindow::fromWinId)
有时候需要做框架集成的东西,需要把其他客户端像组件一样集成到一个客户端中,类似于一个软件集成的平台客户端,统一用一个中心管理的客户端做类似于控制面板一样的东西去调用不同的软件。此时就必须相应不同的点击图标的事件去嵌入到主界面里面。下面简单的对windows平台上面Qt的界面中嵌入系统自带的计算机程序做简单的说明。
一、首先是获取计算机程序的窗口类名称,只要利用的是VS中的Spy++工具,在vs菜单“工具”中打开之后如图所示。查找计算器的窗口句柄并获取到具体的类名。
CTRL+F,搜索句柄,获取到对应的类名。
二、通过windows系统函数获取软件进程窗口的句柄。
- #include<Windows.h>
 - 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
- #pragma once
 - #include <QtWidgets/QWidget>
 - #include "ui_winId.h"
 - class winId : public QWidget
 - {
 - Q_OBJECT
 - public:
 - winId(QWidget *parent = Q_NULLPTR);
 - ~winId();
 - private:
 - Ui::winIdClass *ui;
 - };
 
winId.cpp
- #include "stdafx.h"
 - #include "winId.h"
 - winId::winId(QWidget *parent)
 - : QWidget(parent),ui(new Ui::winIdClass)
 - {
 - ui->setupUi(this);
 - //创建进程
 - //QString cmd="C:/Program Files/R/R-3.3.1/bin/x64/Rgui.exe";
 - QString cmd = "C:/Windows/system32/calc.exe";
 - STARTUPINFO si = { sizeof(si) };
 - PROCESS_INFORMATION pi;
 - si.dwFlags = STARTF_USESHOWWINDOW;
 - si.wShowWindow = true;
 - bool bRet = CreateProcess(
 - NULL,
 - (LPWSTR)cmd.toStdWString().c_str(),
 - NULL,
 - NULL,
 - FALSE,
 - CREATE_NEW_CONSOLE,
 - NULL,
 - NULL, &si, &pi);
 - Sleep(5000);
 - WId wid = (WId)FindWindow(L"CalcFrame", L"计算器");
 - //WId wid = (WId)FindWindow(L"Rgui Workspace",NULL);
 - QWindow *m_window;
 - m_window = QWindow::fromWinId(wid);
 - m_window->setFlags(m_window->flags() | Qt::CustomizeWindowHint | Qt::WindowTitleHint); //
 - QWidget *m_widget;
 - m_widget = QWidget::createWindowContainer(m_window, this->ui->widget);
 - m_widget->setMinimumSize(400, 300);
 - }
 - winId::~winId()
 - {
 - delete ui;
 - }
 
最后的运行效果如下图。
另外在git上面也有一个例子,具体路径为:https://github.com/snasoft/qt-windows-composition-example
http://blog.csdn.net/u013394556/article/details/78534833
外部进程嵌入到Qt进程界面(使用QWindow::fromWinId)的更多相关文章
- Qt 进程和线程之一:运行一个进程和进程间通信
		
Qt提供了对进程和线程的支持.本节讲述了怎样在Qt应用程序中启动一个进程,以及几种常用的进程间通信方法.如果对进程和线程的概念不是很了解,可以看我的另一篇博客:[多进程和多线程的概念. 设计应用程序时 ...
 - Qt启动子进程,子进程关闭时通知主进程,实现主进程对子进程的管理
		
自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: https://www.cnblogs.com/bclshuai/p/11380657.html 1.需求描述 Qt主进程启动 ...
 - 对《将Unreal4打包后的工程嵌入到Qt或者桌面中》一文的补充
		
在上一文中本人尝试将Ue4嵌入到Qt中,但依然有一些问题没有去尝试解决.今天因为帮助知乎专栏作者@大钊的关系,顺便进行补完. 2018.7.18更新: 正好在参加杭州UnrealCircle的时候见到 ...
 - (七) 一起学 Unix 环境高级编程(APUE) 之 进程关系 和 守护进程
		
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
 - Linux进程学习(孤儿进程和守护进程)
		
孤儿进程和守护进程 通过前面的学习我们了解了如何通过fork()函数和vfork()函数来创建一个进程.现在 我们继续深入来学习两个特殊的进程:孤儿进程和守护进程 一.孤儿进程 1.什么是 孤儿进程如 ...
 - 基于toyix的进程和轻权进程的学习
		
我们在平时的计算机课上学习过进程,知道程序的执行的背后其实就是进程在进行一些操作.大家都知道打开windows的任务管理器可以看到正在运行的进程,当程序卡死时,可以在任务管理器里强制关闭相关程序的进程 ...
 - linux下的守护进程及会话、进程组
		
守护进程.会话.进程组网上有许多不错的资料.我也是网上搜罗了一堆,加上自己的理解.不敢说原创,只是写在这怕自己忘记罢了.才疏学浅,难免有错误,欢迎大家指正.下面这篇写很不错,大家可以去看看:http: ...
 - Linux下0号进程的前世(init_task进程)今生(idle进程)----Linux进程的管理与调度(五)【转】
		
前言 Linux下有3个特殊的进程,idle进程(PID = 0), init进程(PID = 1)和kthreadd(PID = 2) idle进程由系统自动创建, 运行在内核态 idle进程其pi ...
 - linux的0号进程和1号进程
		
linux的 0号进程 和 1 号进程 Linux下有3个特殊的进程,idle进程(PID = 0), init进程(PID = 1)和kthreadd(PID = 2) * idle进程由系统自动创 ...
 
随机推荐
- 百度ueditor vue项目应用 -- 图片上传源码修改
			
本文目的有两个,一.废掉单图上传,二.改造多图上传 大家都知道百度ueditor不是针对vue项目开发的,官方文档提供的源码包里有需要后端配置的接口,but到vue项目就不太好办了,网上有些文章也介绍 ...
 - ZOJ  3171 The Hidden 7's DP
			
传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3203 题目大意给定一串字符串,需要计算出seven的个数. #incl ...
 - 17、网卡驱动程序-DM9000举例
			
(参考:cs89x0.c可以参考) DM9000 芯片实现网络功能的基础,在接收数据时采用中断方式,即当有数据到来并在 DM9000 内部 CRC 校验通过后会产生一个接收中断: 网卡驱动程序框架: ...
 - Mac OS X Kernel Basic User Credentials
			
User Credentials In order to understand security in OS X, it is important to understand that there a ...
 - IfSpeed 带宽计算
			
http://www.360doc.com/content/11/0304/22/2614615_98214710.shtml http://www.cisco.com/support/zh/477/ ...
 - ArcGIS二次开发入门(一)
			
作者:朱金灿 来源:http://blog.csdn.net/clever101 公司培训ArcGIS二次开发(C#作为开发语言),自己回家动手实践了一下. 1. 首先是二次开发环境的安装(AE 10 ...
 - tomcat 设置session过期时间(四种方式)
			
1.在tomcat-->conf-->servler.xml文件中定义: <Context path="/test" docBase="/test&qu ...
 - Hadoop源码分析(MapReduce概论)
			
大家都熟悉文件系统,在对HDFS进行分析前,我们并没有花非常多的时间去介绍HDFS的背景.毕竟大家对文件系统的还是有一定的理解的,并且也有非常好的文档.在分析Hadoop的MapReduce部分前,我 ...
 - oracle 中日期的加减
			
oracle 中日期的加减 加法 select sysdate,add_months(sysdate,12) from dual; --加1年 select sysdate,add_ ...
 - 嵌入式project师考试知识点总结  微内核结构
			
在操作系统的结构设计中,微内核结构表示的是 A) 总体式结构 B) 层次结构 C) 分布式结构 D) 客户机/server结构 微内核是指把操作系统结构中的内存管理.设备管理.文件系统等 ...