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

本文介绍了如何在Qt界面中嵌入Unity程序,通过QProcess启动Unity进程,利用WinApi获取其窗口句柄,然后通过QWindow创建并显示在Qt窗口中。作者参考了道格拉斯范朋克的博客实现此功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

         近期,因项目需要,需要在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 <QtWidgets/QMainWindow>
#include "ui_CMainWindow.h"
#include <windows.h>
#include <QProcess>
#include <QWindow>
#include <QString>
#include <QDebug>

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界面嵌入外部应用程序_道格拉斯范朋克的博客-优快云博客

<think>好的,用户想了解如何在Qt中使用QProcess启动外部程序需要示例代码。我之前已经整理过相关的引用内容,现在需要把这些信息整合成一个清晰的回答。首先,用户提到的是QProcess的三个主要方法:start()、execute()和startDetached()。根据引用内容,这三个方法有不同的使用场景和特点。我需要分别解释每个方法的作用,提供相应的代码示例。需要确认每个方法的阻塞性以及输出处理方式。比如execute()是阻塞的,而start()是非阻塞的,需要处理信号和槽来读取输出。startDetached()则是完全分离的进程,父进程是init,不会随主程序退出而终止。 接下来,示例代码部分要确保正确性。根据引用中的代码,比如execute()的调用方式比较简单,直接静态调用。而start()需要创建QProcess实例,连接readyReadStandardOutput信号来读取输出。startDetached()同样作为静态方法使用,但需要注意参数传递的方式。 另外,用户可能需要了解不同方法的应用场景。比如需要行运行外部程序时用start(),简单的顺序执行用execute(),希望程序独立运行则用startDetached()。还要检查是否有遗漏的细节,比如如何处理错误,或者如何传递参数。例如,在start()的例子中,参数需要以QStringList的形式传递,而路径中的空格可能需要引号包裹。 最后,生成相关问题需要考虑用户可能的后续疑问,比如如何捕获错误输出、如何传递参数、不同方法的性能比较等。确保问题覆盖常见的使用场景和潜在问题。</think>在Qt中使用QProcess启动外部程序主要有三种方式,下面分别说明其特点提供示例代码: ### 一、阻塞式调用(QProcess::execute) ```cpp int result = QProcess::execute("notepad.exe", QStringList() << "C:\\test.txt"); if(result == -2) { qDebug() << "启动失败"; } ``` - 特点:主程序会等待外部程序执行完成[^2] - 输出:自动重定向到主程序控制台[^1] - 应用场景:简单的顺序执行 ### 二、子进程方式(QProcess::start) ```cpp QProcess *process = new QProcess(this); process->start("C:/Program Files/App/app.exe", QStringList() << "-arg1"); connect(process, &QProcess::readyReadStandardOutput, [=](){ qDebug() << process->readAllStandardOutput(); }); ``` - 特点:非阻塞执行,可行多个进程[^1] - 输出:需自行读取管道数据[^1] - 生命周期:随主程序退出而终止[^2] ### 三、独立进程方式(QProcess::startDetached) ```cpp qint64 pid; bool success = QProcess::startDetached( "cmd.exe", QStringList() << "/c" << "dir", "C:/", &pid ); ``` - 特点:完全独立于主程序运行[^2] - 输出:无法直接获取输出[^2] - 应用场景:需要长期运行的后台进程
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫尘少主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值