Unity程序嵌入Qt后点击UI按钮Button没有反应

一、前言

在一次项目中,需要将Unity程序嵌入qt中,并在主界面显示,根据网络资料与相关代码,成功将unity程序嵌入,但是在点击Unity的Button按钮时却没有响应,在查找相关资料后,解决问题,在此记录。

二、问题原因

在单独运行unity的exe程序,button按钮能够正常触发,根据相关资料,发现问题可能是出现在unity程序嵌入qt窗口时,鼠标事件传递关系出现问题,猜测可能是嵌入时需要进行某些设置,之后尝试其他嵌入方式后,成功解决问题。

三、相关代码

void ShowUnityWindowsInQt::setWindowParent(HWND parentWidgetHandle, const QString& sonWindowTitleName,QWidget* parent)
{
    HWND hfigure;
    while (true)
    {
        hfigure = FindWindow(NULL ,(LPCWSTR)(sonWindowTitleName.unicode()));
        if (hfigure != NULL)
        {
            break;
        }
    }
	::SetParent(hfigure, parentWidgetHandle);

	LONG_PTR style = GetWindowLongPtr(hfigure, GWL_STYLE);
	style = style & ~(WS_THICKFRAME | WS_CAPTION | WS_SIZEBOX | WS_MAXIMIZEBOX | WS_MINIMIZEBOX);//移除子窗口的移动和调整大小的样式
	SetWindowLongPtr(hfigure, GWL_STYLE, style);

    m_window = QWindow::fromWinId((WId)hfigure);
    m_window->setFlags(m_window->flags() | Qt::CustomizeWindowHint | Qt::WindowTitleHint); //这边可以设置一下属性
    m_widget  = QWidget::createWindowContainer(m_window,this);
	m_widget->setFocusPolicy(Qt::StrongFocus);

    m_widget->setParent(parent);

    m_widget->show();


}

四、参考文章

QT+Unity3D 超详细(将unity3D与QT进行连接,并实现信息传递)

五、最后 

在参考文章的内容是,该文章作者说有边框能缩放,没有边框就无法缩放,但是本人在使用以上代码嵌入unity窗口后,暂时没有遇到该问题,即没有边框,且能够正常缩放,同时ui按钮能够正常触发,此为本人项目中实现代码,仅供参考,如有问题,欢迎指正。

******************************************20250407 增加更新*************************************

在使用过程中发现,仅此设置时,当进行窗口大小缩放时,出现unity界面闪烁刷新现象,且严重影响使用观感,故增加下列函数。

//设置窗口为调节大小模式
void ShowUnityWindowsInQt::setWindowsResize()
{
	LONG_PTR style = GetWindowLongPtr(hfigure, GWL_STYLE);    //通过句柄获取窗口类型
	style |= WS_CHILD;                                        //增加WS_CHILD类型,测试发现此类型窗口缩放时流畅,但无法点击触发UI
	SetWindowLongPtr(hfigure, GWL_STYLE, style);                //更新窗口类型
}

//设置窗口为可点击触发UI模式
void ShowUnityWindowsInQt::setWindowsClicked()
{
	LONG_PTR style = GetWindowLongPtr(hfigure, GWL_STYLE);    //通过句柄获取窗口类型
	style = style & ~(WS_CHILD);                                //移除加WS_CHILD类型
	SetWindowLongPtr(hfigure, GWL_STYLE, style);              //更新窗口类型
}

在父窗口中添加事件过滤器,通过鼠标事件判断调用这两个函数,事件过滤器代码如下

bool MainWindow::eventFilter(QObject * watched, QEvent * event)
{
	if (watched->objectName() == "") {                    //判断点击的是Qt自带状态栏中右下角用于缩放窗口的小三角形
		if (watched->parent()) {                            //增加判断,否则在初始化时可能报错
			if (watched->parent()->objectName() == "statusBar") {        //状态栏的名字
				if (event->type() == QEvent::MouseButtonPress) {
					QMouseEvent* e2 = static_cast<QMouseEvent*>(event);
					QWidget* w2 = static_cast<QWidget*>(watched);
					if (e2->button() == Qt::LeftButton && (e2->pos().x() < w2->width()&& e2->pos().x()>0)) {
						m_unityWidget->setWindowsResize();
					}
				}
				else if (event->type() == QEvent::MouseButtonRelease) {
					QMouseEvent* e2 = static_cast<QMouseEvent*>(event);
					QWidget* w2 = static_cast<QWidget*>(watched);
					if (e2->button() == Qt::LeftButton && (e2->pos().x() < w2->width() && e2->pos().x() > 0)) {
						m_unityWidget->setWindowsClicked();
					}
				}
			}

		}
	}

	return QMainWindow::eventFilter(watched,event);
}

在初始化中添加过滤器 

qApp->installEventFilter(this);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值