有时候需要做框架集成的东西,需要把其他客户端像组件一样集成到一个客户端中,类似于一个软件集成的平台客户端,统一用一个中心管理的客户端做类似于控制面板一样的东西去调用不同的软件。此时就必须相应不同的点击图标的事件去嵌入到主界面里面。下面简单的对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. ASI使用

    一.ASI类库集成: .添加源代码文件 ASIAuthenticationDialog.h ASIAuthenticationDialog.m ASICacheDelegate.h ASIDataCo ...

  2. [Angular 2] BYPASSING PROVIDERS IN ANGULAR 2

    Artical --> BYPASSING PROVIDERS IN ANGULAR 2 Here trying to solve one problem: On the left hand s ...

  3. 算法 Tricks(三)—— 判断序列是否为等差数列

    判断一个数列不是等差数列,要比判断一个数列是等差数列比较容易. bool progressive = true; for (int i = 0; i < A.size() - 1; ++i){ ...

  4. 【20.23%】【codeforces 740A】Alyona and copybooks

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  5. Solving the Problem of Overfitting

    The Problem of Overfitting Cost Function Regularized Linear Regression Note: [8:43 - It is said that ...

  6. mha && 脚本拉起

    ip分布:  vip 192.168.238.222 mha_manager 192.168.238.131 监控服务器 master 192.168.238.128 主库GTID复制模式 slave ...

  7. ActiveMQ简单入门实例

    一.下载MQ 官方网站下载:http://activemq.apache.org/ 我用的是 apache-activemq-5.15.0-bin 二.安装 我用的是64位所以双击 apache-ac ...

  8. Intent七在属性之一:ComponentName 分类: H1_ANDROID 2013-11-10 10:54 1184人阅读 评论(1) 收藏

    注:在<疯狂android讲义>中,此属性称为Component,官方文档中称为ComponentName. 1.The name of the component that should ...

  9. 打开cad文件的几种方法

    转自原文 打开cad文件的几种方法 IWorkspaceFactory pWorkspaceFactory; IFeatureWorkspace pFeatureWorkspace; IFeature ...

  10. SPOJ4491. Primes in GCD Table(gcd(a,b)=d素数,(1&lt;=a&lt;=n,1&lt;=b&lt;=m))加强版

    SPOJ4491. Primes in GCD Table Problem code: PGCD Johnny has created a table which encodes the result ...