近期,因项目需要,需要在UI界面上显示Unity程序,实现在界面上控制Unity中的模型行为,原本想着是将Unity环境集成到VS上,但是在网上查询半天有没有好的方法达成目的,但是事与愿违,只能另辟蹊径。通过调用外部进程的方式将其加载到QT界面上,在通过网络通信的方式达成目的。通过查询资料所得,Qt的QProcess和QWindow可以为我们完成这样的任务。核心思想是:
1.通过QProcess启动外部程序,获取外部程序的进程ID
2.WinApi通过进程ID获取窗口句柄
3.QWindow::fromWinId(WId id)创建window
4.使用QWidget充当容器承接QWindow
.h
#pragma once
#include
#include "ui_CMainWindow.h"
#include
#include
#include
#include
#include
class CMainWindow : public QMainWindow
{
Q_OBJECT
public:
CMainWindow(QWidget *parent = Q_NULLPTR);
~CMainWindow();
void init();
void func();
private:
Ui::CMainWindowClass* m_pUI;
QProcess* m_pProcess;
QString cmd;
WId wid;
};
.cpp
#include "CMainWindow.h"
CMainWindow::CMainWindow(QWidget *parent)
: QMainWindow(parent)
, m_pUI(new Ui::CMainWindowClass)
, m_pProcess(nullptr)
, wid(0)
{
m_pUI->setupUi(this);
init();
}
CMainWindow::~CMainWindow()
{
delete m_pUI;
}
void CMainWindow::init()
{
m_pProcess = new QProcess(this);
cmd = QString("F:\\networkPro\\112233\\youpro.exe");
func();
}
void CMainWindow::func()
{
if (wid == 0)
{
m_pProcess->setProcessChannelMode(QProcess::MergedChannels);
m_pProcess->start(cmd);
Sleep(1000);
wid = (WId)FindWindow(L"UnityWndClass", nullptr);
QWindow* pWindow = QWindow::fromWinId(wid);
QWidget* pWidget = QWidget::createWindowContainer(pWindow,this);
/* pWidget->setMinimumSize(QSize(800,800));*/
pWidget->setStyleSheet("QWidget{color: rgb(47, 147, 200);background-color:rgb(51,44,46);}");
m_pUI->scrollArea->setWidget(pWidget);
}
else
{
qDebug() << "wid = " << wid;
qDebug() << "地图已嵌入";
}
}
.ui
运行效果图
代码实现是借鉴博主:道格拉斯范朋克
地址:Qt源码解析2---外部程序嵌入到Qt进程界面_qt界面嵌入外部应用程序_道格拉斯范朋克的博客-CSDN博客