• 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

    #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;
    }

    最后的运行效果如下图。

  • 相关阅读:
    数组的学习——有序数组中插入及删除数值的问题分析
    关于控制台输入年月,显示该月日历的问题分析
    关于控制台的输入,分支结构及循环的用法的一些总结
    坚持学习,坚持写博客,记录学习的点点滴滴,先从学习JAVA开始!
    Immutable Object模式
    Windows GIT SSH 免密教程
    腾讯云服务器购买
    Centos7系统中安装JDK、Tomcat、Mysql
    SonarQube使用教程
    UEditor使用说明
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/14664474.html
Copyright © 2020-2023  润新知