zoukankan      html  css  js  c++  java
  • 外部进程嵌入到Qt进程界面(使用QWindow::fromWinId)

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

    最后的运行效果如下图。

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

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

  • 相关阅读:
    Java基础学习07--内部类与常用类
    Java基础学习06--集合
    leetcode124
    Python深度学习笔记09--使用Keras建立循环神经网络
    Python深度学习笔记08--处理文本数据的常用方法
    详解DNS域名解析系统(域名、域名服务器[根、顶级、授权/权限、本地]、域名解析过程[递归与迭代])
    计算机网络之应用层概述(C/S模型与p2p模型)
    计算机网络传输层之TCP拥塞控制(慢开始与拥塞避免、快重传和快恢复)
    计算机网络传输层之TCP流量控制
    计算机网络传输层之TCP可靠传输
  • 原文地址:https://www.cnblogs.com/findumars/p/8001326.html
Copyright © 2011-2022 走看看