对《将Unreal4打包后的工程嵌入到Qt或者桌面中》一文的补充

在上一文中本人尝试将Ue4嵌入到Qt中,但依然有一些问题没有去尝试解决。今天因为帮助知乎专栏作者@大钊的关系,顺便进行补完

已知的坑

1、因为启动的exe进程并非游戏进程,所以通过QProcess的状态来判断Ue4是否启动是不对的,推荐使用WINAPI来获取对应线程。

2、可以在项目设置中修改窗口显示标题,可以把讨厌的(32-bit, PCD3D_SM5)去掉,强烈推荐使用窗口句柄查看工具,我是网上下了句柄精灵。(窗口标题后面都是有空格的)

嵌入Qt后,UE4无法接受键盘鼠标输入

使用 以下函数

//window为QWindow
window->setKeyboardGrabEnabled(true);
window->setMouseGrabEnabled(true);
在使用createWindowContainer函数时有两个选择
QWidget::createWindowContainer(window,nullptr,Qt::Window);
QWidget::createWindowContainer(window);

区别在于前者为窗口模式,可以很好接受鼠标与键盘输入,后者无法接受鼠标操作。

但是如果使用Qt的QProcess来启动Ue4,前者就只能接受鼠标操作了。

本人认为这个是焦点的问题,需要在焦点改变时重新指定。这里就麻烦各位自己动手解决了

关于静默启动外部程序与枚举进程与窗体句柄

因为本人对WINAPI不熟所以只找了一些资料

打开一个外部程序,一般是通过ShellExecute/Ex或CreateProcess或WinExec等API。

至于隐藏主窗口以及控制窗口上的控件,这个根据不同的程序会有一定的复杂程度,首先是找到所谓的主窗口,然后再枚举窗口上的子窗口,通过一系列API模拟点击或读取/设置文本内容等。

参考:http://bbs.csdn.net/topics/240049935

https://www.cnblogs.com/zjutlitao/p/3889900.html

代码

#pragma comment(lib, "User32.lib")

#include "widget.h"
#include "ui_widget.h"
#include "windows.h"
#include <QWindow>
#include <QDebug>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget),process(nullptr)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    //进程无法直接关闭,因为Ue4会启动另一个UeGame进程,如果是发布模式名字会改变
//    process->terminate();
//    process->waitForFinished();
    if(process)
        delete process;
    delete ui;
}

void Widget::on_pushButton_clicked()
{
//      //因为启动的进程并非游戏进程,所以通过QProcess的状态来判断Ue4是否启动是不对的
//      //推荐使用WINAPI来获取对应线程
    QString unreal4Path{"D:/QtProject/QtWithUnreal4/WindowsNoEditor/DemoGame.exe"};
    QStringList arguments;
    arguments << "-WINDOWED";
    process=new QProcess;
    connect(process,SIGNAL(stateChanged(QProcess::ProcessState)),this,SLOT(insetQt(QProcess::ProcessState)));
    process->start(unreal4Path,arguments);

//    WinExec("D:\\QtProject\\QtWithUnreal4\\WindowsNoEditor\\DemoGame.exe",SW_HIDE);

}

void Widget::insetQt(QProcess::ProcessState state){
        qDebug()<<state;
    if(state!=QProcess::Running)
        return;

    Sleep(3000);
    //可以在项目设置中修改窗口显示标题,可以把讨厌的(32-bit, PCD3D_SM5)去掉
    //强烈推荐使用窗口句柄查看工具,我是网上下了句柄精灵
    HWND hwnWindow=FindWindow(NULL,L"DemoGame  ");

    qDebug()<<hwnWindow;
    QWindow *window=QWindow::fromWinId((WId)hwnWindow);

//方法一
//        SetParent(hwnWindow,(HWND)QWidget::winId());
//        window->showFullScreen();
//方法二
     window->requestActivate();
//     //嵌入Qt窗口,需要设置焦点让Ue4接受按键事件
     QWidget *windowWidget=QWidget::createWindowContainer(window,nullptr,Qt::Window);
//     QWidget *windowWidget=QWidget::createWindowContainer(window);

     //获取键盘与鼠标的输入
     window->setKeyboardGrabEnabled(true);
     window->setMouseGrabEnabled(true);
     ui->verticalLayout->insertWidget(0,windowWidget,1);
//     windowWidget->setFocusPolicy(Qt::StrongFocus);
//     windowWidget->setFocus();
//     windowWidget->grabKeyboard();
//     windowWidget->grabMouse();
     this->setFocusPolicy(Qt::NoFocus);

}

原文地址:https://www.cnblogs.com/blueroses/p/9151094.html

时间: 2024-08-02 23:43:00

对《将Unreal4打包后的工程嵌入到Qt或者桌面中》一文的补充的相关文章

对《分享一下自己用c++写的小地图》一文的补充

在写完上一篇文章后,发现了一个问题: 那就是编写的插件无法实时预览. 在学习了Slate之后,我找到了方法: 重写SynchronizeProperties函数 头文件中添加: #if WITH_EDITOR UFUNCTION() virtual void SynchronizeProperties() override; #endif 因为只需要在编辑器中运行,所以加上了#if WITH_EDITOR cpp文件中添加: #if WITH_EDITOR void UMiniMap::Sync

分享一位国外大牛写的不规则物体像素级碰撞检测算法及详解

最近在做一个有关投篮的小游戏,需要用到像素级碰撞检测,as3自带的hitTestObject显然无法满足需要.网上搜寻了一下,在9ria挖坟挖到两篇好文章: 分享一个超高效的不规则物体碰撞检测的类~~ [Lii]超高效的不规则物体碰撞检测<效率优化> 第一篇文章介绍了一位国外大牛写的不规则物体像素级碰撞检测算法,原理是用bitmap绘制两对象不透明区域,利用混合模式计算出两对象的相交区域. 第二篇文章则在该算法的基础上进行了效率的优化,原理是判断出两对象发生hitTestObject碰撞后,将

如何优雅的写一篇安利文-以Sugar ORM为例

前言 我最近喜欢把写的十分优美的技术文章叫做安利文.首先,文章必须是原创而非软广:其次,阅读之后不仅能快速吸纳技术要点并入门开发,还能感同身受的体会作者热情洋溢的赞美和急于分享心得体验的心情,让人感觉相见恨晚,醍醐灌顶. 安利文基于技术文章但又高于技术文章,同是经验总结,但却因为作者认真的揣摩每一个标点.断句而变得优雅.一篇满是主观感受的文章却不嚼之乏味,作者用心的指出每一个需要注意的技术亮点在文字中如蛟龙戏水,让阅读者大呼过瘾.因此,我觉得能原创分享一篇技术文章精神已经难能可贵,但若能锦上添花

Docz 用 MDX 写 React UI 组件文档

Docz 用 MDX 写 React UI 组件文档 前言 为了提升开发效率,创建一套 UI 组件库是一种较为有效的方式之一:可以减少重复工作.提高可复用,所以现在越来越多团队开始创建自己的 UI 组件库.较早的 Twitter 的 Bootstrap 虽然只能称为 UI 库,但也大大提升了开发效率.后面 MVVM 大行其道 ,前端终于可以把 HTML.CSS.JS 放在一起开发包含 UI .交互真正意义上的组件了,现在有基于 React 的 Material-UI.国内阿里金服基于 React

分享一个很早之前写的小工具DtSpyPlus

几年前写的一个获取windows窗体基本信息和屏幕取色的小工具 ,一直在用. 下载地址 http://files.cnblogs.com/dint/SpyPlus.zip

【原创】问题定位分享(16)spark写数据到hive外部表报错ClassCastException: org.apache.hadoop.hive.hbase.HiveHBaseTableOutputFormat cannot be cast to org.apache.hadoop.hive.ql.io.HiveOutputFormat

spark 2.1.1 spark在写数据到hive外部表(底层数据在hbase中)时会报错 Caused by: java.lang.ClassCastException: org.apache.hadoop.hive.hbase.HiveHBaseTableOutputFormat cannot be cast to org.apache.hadoop.hive.ql.io.HiveOutputFormat at org.apache.spark.sql.hive.SparkHiveWrit

【转】分享一份C语言写的简历

个人观点:文章想法很棒,作者的编码风格也很赞,可以从中学到不少东西.转载的文章是我都用心看过的,而且希望后续再可以回过头看的文章,努力让自己的能力越来越强,加油 这里黑客新闻吗?作者用代码更新了自己的简历,是不是很接地气,特符合程序员的逼格.这是一份可读可执行的C语言源文件,也是作者编码风格的体现. #include <stdio.h> #include <time.h> typedef struct { union { char * company; char * school;

关于微信二次分享,描述变链接的解决方法(一)----文档说明

http://www.cnblogs.com/joshua317/p/4761948.html 前言: 最近工作中遇到了使用微信二次分享的时候,标题被截短,描述也变成了链接,图片也没有,运营人员半夜还在嚷嚷,无奈只好硬着头皮去百度,去google,但是悲催的是没有详细的解决方法,最终只能自己去研究,还好最终搞出来了,决定分享一下,帮助需要的人.博文,分两篇,第一篇主要是微信的官方文档说明,第二篇主要是代码部分: 一.微信JS-SDK说明文档 1.概述 微信JS-SDK是微信公众平台面向网页开发者

如何写好产品需求文档?

常常有人问我怎么写prd,在深受市面上流行的功能需求模板“残害”之后,我现在一般不会向别人推荐任何所谓的“模板”. 需求文档是产品需求的表达方式,而其中需要描述什么内容取决于产品经理想要描述什么,即产品经理的需求.如果产品经理的需求是明确的,而且产品经理脑中有物,那么需求文档自然而然就出来了.最可怕的是产品经理自己都不知道自己要描述的是什么内容,这个时候即使有模板,写出来的东西也是一团糟. 互联网产品以用户为中心,所以prd也应该站在用户的角度来描述,如果不知道自己要写什么,在写文档之前产品经理

【10000+文章汇总】技巧都在这里了,你也能写出1w+好文!

自 #我要10000+# 计划启动以来,已经有多位作者参与其中,我们通过文章专属推广渠道,取得了惊人的效果!单篇文章的阅读量,最高达到55倍的阅读量增长.从默默无闻,到有人喜欢,获得关注的同时,打造个人影响力. 现在让我们来看看,这些 10000+ 好文,都有哪些~ 标题 阅读量 青铜到王者,快速提升你 MySQL 数据库的段位! 82340 MySQL十大经典错误案例(附解决方案) 70894 [揭秘]数据库面试葵花宝典,让你面试一次过 35681 开发人员学Linux,大型系统开发经验谈 1