Qt界面中嵌入其他exe程序的界面,使用Qt5

Posted gaoxudong0704

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt界面中嵌入其他exe程序的界面,使用Qt5相关的知识,希望对你有一定的参考价值。

下面用一个小例子来演示如何在Qt的界面中嵌入其他exe程序的界面,最终效果如下图所示。本文参考了

http://blog.csdn.net/jiaoyaziyang/article/details/49802993,感谢原作者。

 

 

 

下面是具体的实现方法,用Windows自带的计算器程序做例子。主要的思路就是获取到计算器程序的窗口类名称,然后在Qt中利用QWindow的静态函数fromWinId,创建出QWindow对象,然后将这个对象放到一个QWidget中。

 

首先是获取计算器程序的窗口类名称,主要利用的是VS中的Spy++工具,在VS菜单“工具”中,打开之后如下图所示

 

然后Ctr+F,进行搜索,出现如下界面

确定之后可以获取到类名

 

 完整的代码如下所示,这段代码是放在了一个QMainWindow的构造函数中,首先是调用了windows的API创建了计算器程序的进程,然后思路同前面所述。

 

 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(50);

    WId wid = (WId)FindWindow(L"CalcFrame",NULL);
    //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);

  

 

以上是关于Qt界面中嵌入其他exe程序的界面,使用Qt5的主要内容,如果未能解决你的问题,请参考以下文章

如何在单个 App 中混合 Qt 和原生 iOS 用户界面元素?

外部进程嵌入到Qt进程界面(使用QWindow::fromWinId)

python QT5运行Edge

qt5.9.9运行键在哪

[环境配置][原创]qt5.14在vs2017编译器运行提示无法运行rc.exe

如何调用Android系统程序详细信息界面