Qt窗口中嵌入UE程序(文末含源代码)

需求:在Windows平台软件中集成一个VR模块,能够在Qt软件中集成一个UE生成的可执行窗口程序。

  1. 新建一个c++类:VRModule,继承QWidget。这个类适是用于加载UE程序的。添加头文件:
#include <QObject>
#include <QWidget>
#include <QProcess>
#include <QTimer>
#include <QtConcurrent>  // 需要在Pro文件中添加QT += concurrent
#include "windows.h"
  1. 定义一个定时器,用于更新窗口的激活状态和位置
m_timer = new QTimer(this);
connect(m_timer, &QTimer::timeout, this, &VRModule::timerShowUe);
m_timer->start(10);
void VRModule::timerShowUe() {
   
   
    if (m_Widget) {
   
   
        if (GetForegroundWindow() != m_hwnWindow && !this->isActiveWindow()) {
   
   
            SetWindowPos(m_hwnWindow,
                        HWND_NOTOPMOST,
                        mapToGlobal(m_Widget->pos()).x(),
                        mapToGlobal(m_Widget->pos()).y(),
                        m_Widget->width(),
                        m_Widget->height(),
                        SWP_NOACTIVATE);
        } else {
   
   
            SetWindowPos(m_hwnWindow,
                         HWND_TOPMOST,
                         mapToGlobal(m_Widget->pos()).x(),
                         mapToGlobal(m_Widget->pos()).y(),
                         m_Widget->width(),
                         m_Widget->height(),
                         SWP_NOACTIVATE);
        }
    }
}
  • GetForegroundWindow() 函数用于获取当前前台窗口的句柄。
  • m_hwnWindow ue程序窗口句柄
  • this->isActiveWindow() 检查当前窗口是否处于活动状态。
  • SetWindowPos() 是一个 Windows API 函数,用于改变窗口的位置和大小。

这段代码的功能解释如下:

  • 如果前台窗口不是 m_hwnWindow,且当前窗口不处于活动状态,代码使用 SetWindowPos() 设置 m_hwnWindow 的位置,使其不是最顶层的窗口。
  • 如果不满足上述条件,则使用 SetWindowPos()m_hwnWindow 设置为最顶层的窗口。

mapToGlobal() 函数用于将显示UE程序的QWidget坐标转换为屏幕坐标。SWP_NOACTIVATE 标志用于在移动窗口时防止激活窗口。

  1. 添加一个函数,用于外部调用该类,传递UE程序的路径和用于显示UE程序的QWidget窗口
void VRModule::getPathAndWidgetContainer(const QString &path, QWidget *widgetContainer) {
   
   
    m_Widget = widgetContainer;
    //获取启动程序的名字
    QString fileNameWithExtension = QFileInfo(path).fileName();
    QString baseName = fileNameWithExtension.section('.', 0, 0);
    QString APPName = QString("%1 (64-bit Development PCD3D_SM6) ").arg(baseName);
    m_appName = APPName.toStdWString();

    //应用程序以窗口模式运行,而不是全屏
    QStringList arguments;
    arguments << "-WINDOWED";

    m_process = new QProcess;
    m_process->start(path, arguments);
    QtConcurrent::run([this]{
   
   
        while (true) {
   
   
            m_hwnWindow = FindWindow(L"UnrealWindow", m_appName.c_str());
            LONG style = GetWindowLong(m_hwnWindow, GWL_EXSTYLE) & (~WS_OVERLAPPEDWINDOW);
            //隐藏图标
            SetWindowLong(m_hwnWindow, GWL_EXSTYLE, style | WS_EX_TOOLWINDOW);
            //隐藏菜单栏
            SetWindowLong(m_hwnWindow, GWL_STYLE, 
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

taciturn丶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值