QT调用外部程序并嵌入UI界面

介绍

         近期,因项目需要,需要在UI界面上显示Unity程序,实现在界面上控制Unity中的模型行为,原本想着是将Unity环境集成到VS上,但是在网上查询半天有没有好的方法达成目的,但是事与愿违只能另辟蹊径。通过调用外部进程的方式将其加载到QT界面上,在通过网络通信的方式达成目的。通过查询资料所得,Qt的QProcess和QWindow可以为我们完成这样的任务。核心思想是:

        1.通过QProcess启动外部程序,获取外部程序的进程ID

        2.WinApi通过进程ID获取窗口句柄

        3.QWindow::fromWinId(WId id)创建window

        4.使用QWidget充当容器承接QWindow

工具使用

      使用的工具使用VS自带的Spy++.exe,使用该工具可以获取外部程序的类名和标题。

 

 实现代码

 .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调用外部程序并嵌入UI界面_第1张图片

 运行效果图

 代码实现是借鉴博主:道格拉斯范朋克

地址:Qt源码解析2---外部程序嵌入到Qt进程界面_qt界面嵌入外部应用程序_道格拉斯范朋克的博客-CSDN博客

你可能感兴趣的:(日常开发日记,c++)