qt界面嵌入外部进程界面

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

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

 

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

 

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

 

[cpp]  view plain  copy
 
  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

 

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

winId.cpp

 

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

最后的运行效果如下图。

  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值