QT中使用unity

qt把unity发入widget中
头文件showunitywindowsinqt

#ifndef SHOWUNITYWINDOWSINQT_H
#define SHOWUNITYWINDOWSINQT_H
#include <QObject>
#include <QProcess>
#include <windows.h>
#include <winuser.h>
#include <QDebug>
class ShowUnityWindowsInQt : public QObject
{Q_OBJECT
public:explicit ShowUnityWindowsInQt(QObject* parent = nullptr);~ShowUnityWindowsInQt();void startUnityProgram(const QString& unityExePath);void setWindowParent(HWND parentWidgetHandle, const QString& sonWindowTitleName);
signals:void unityProgramStarted();//定义信号不需要在cpp文件中实现。信号本身是一种声明,它告诉编译器该对象将会发出该信号,其他对象可以连接到这个信号以接收通知。
private:QProcess* process;
};
#endif // SHOWUNITYWINDOWSINQT_H

cpp文件 showunitywindowsinqt.cpp

#include "showunitywindowsinqt.h"
#include <QTimer>
#include <QThread>ShowUnityWindowsInQt::ShowUnityWindowsInQt(QObject* parent): QObject{parent}
{//Qprocess 执行行外部进程,它提供了一种在应用程序内部启动和管理外部程序的方式process = new QProcess(this);connect(process, &QProcess::started, this, &ShowUnityWindowsInQt::unityProgramStarted);//   当执行新进程时将会发射信号//QProcess::started 信号是在 QProcess 对象开始执行新进程时发出的}ShowUnityWindowsInQt::~ShowUnityWindowsInQt()
{process->kill();//强制终止当前正在运行的进程
}void ShowUnityWindowsInQt::startUnityProgram(const QString& unityExePath)
{process->setProgram(unityExePath);//将 unityExePath 设置为要执行的程序路径process->start(QIODevice::Truncate);//启动进程qDebug() << "PID: " << process->processId();//打印出当前进程的进程 ID(PID)。
}void ShowUnityWindowsInQt::setWindowParent(HWND parentWidgetHandle, const QString& sonWindowTitleName)//父窗口句柄,unity的名称
{qDebug()<<"第一个参数"<<parentWidgetHandle<<"第二个参数"<<sonWindowTitleName;std::wstring titleName = sonWindowTitleName.toStdWString();HWND hfigure = nullptr;//nullptr表示一个空地址或者空指针对象while (true)//找到unity窗口的句柄{//通过 FindWindowW(nullptr, titleName.c_str()) 搜索具有指定窗口名的子窗口,并将返回的子窗口句柄赋值给 hfigure。//将 nullptr 传递给函数的第一个参数,表示查找顶级窗口(即不指定窗口类名),将 titleName.c_str() 传递给函数的第二个参数,表示查找具有指定窗口名的窗口,hfigure = FindWindowW(nullptr, titleName.c_str());//titleName是所指定的窗口名qDebug()<<"搜找到的hfigure是"<<hfigure;if (hfigure != nullptr){qDebug() <<"find sucess";break;}QThread::msleep(100);//延时100毫秒}qDebug() << "话柄是"<<hfigure;RECT rect;qDebug() << "2222";GetWindowRect(parentWidgetHandle, &rect);//获取父窗口的矩形区域QThread::msleep(500);//延时500毫秒SetParent(hfigure, parentWidgetHandle);//将子窗口设置为父窗口的子控件qDebug() << "3333";LONG_PTR dwStyle = GetWindowLongPtr(hfigure, GWL_STYLE);//子窗口样式dwStyle = dwStyle & ~(WS_THICKFRAME | WS_CAPTION | WS_SIZEBOX | WS_MAXIMIZEBOX | WS_MINIMIZEBOX);//移除子窗口的移动和调整大小的样式dwStyle |= WS_CHILD | WS_CLIPCHILDREN;//添加固定位置的样式。WS_CHILD 表示这是一个子窗口,WS_CLIPCHILDREN 表示绘制子窗口时,只绘制子窗口区域内的内容。(注释此行可实现,滑动鼠标滚轮进行放大缩小)SetWindowLongPtr(hfigure, GWL_STYLE, dwStyle);//更新子窗口的样式MoveWindow(hfigure, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, true);//将子窗口移动到父窗口的位置,并调整大小以适应父窗口SetWindowPos(hfigure, HWND_TOP, 0, 0, rect.right - rect.left, rect.bottom - rect.top, SWP_SHOWWINDOW |SWP_HIDEWINDOW);//设置窗口的位置和大小,并可以控制窗口的显示和隐藏//(hfigure, HWND_TOP, 0, 0, rect.right - rect.left, rect.bottom - rect.top, SWP_SHOWWINDOW |SWP_HIDEWINDOW);0,0,代表与父窗口的左上角位置相同ShowWindow(hfigure, SW_SHOW);//显示子窗口SetFocus(hfigure);//焦点设置到子窗口。使用户直接在该子窗口中输入字符和操作控件,而不必手动点击选中该子窗口。
}

调用上述文件,实现在一个widget中显示unity(widget:ui->tab )

要实现处的头文件(mainwindow.h)

//头文件
#include "showunitywindowsinqt.h"
#include <QTcpSocket>//定义 unit与tcp协议ShowUnityWindowsInQt* util;QTcpSocket *tcpSocket;private slots:void onConnected();//连接void onDisconnected();//连接断开void onReadyRead();//接受unity数据void msg();//向unity发送数据

要实现处的cpp文件(mainwindow.cpp)

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QPushButton"
#include <QProcess>
#include<QJsonArray>
#include <QJsonObject>
#include <QJsonDocument>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//unity的exe显示util = new ShowUnityWindowsInQt(this);//  QString titleName("6");QString titleName("baban2");//unity的.exe名称connect(util, &ShowUnityWindowsInQt::unityProgramStarted, this, [&](){util->setWindowParent((HWND)ui->tab->winId(),titleName);//ui->tab指的是ui设计界面中的一个widget});//当信号被发射时,执行对应的槽函数QString unityExePath("./Baban2/baban2.exe");//unity的路径// QString unityExePath("./unity1/6.exe");util->startUnityProgram(unityExePath);//startUnityProgram启动进程,proess有新进程,unityProgramStarted信号发射,setWindowParent函数触发将unity窗口放入widget窗口中//tcptcpSocket = new QTcpSocket(this);connect(tcpSocket, &QTcpSocket::connected, this, &MainWindow::onConnected);//tcp连接时触发onConnected函数connect(tcpSocket, &QTcpSocket::disconnected, this, &MainWindow::onDisconnected);connect(tcpSocket, &QTcpSocket::readyRead, this, &MainWindow::onReadyRead);//   tcpSocket->connectToHost("127.0.0.1", 12345);//tcp连接的 ip地址 和 端口号tcpSocket->connectToHost("127.0.0.1", 9998);//发送按钮QPushButton *sendbtn=new QPushButton (this);sendbtn->setText("发送");sendbtn->setGeometry(0,0,100,100);connect(sendbtn,SIGNAL(clicked()),this,SLOT(msg()));//发送jsonQJsonObject jsonObject;QJsonArray jsonArray;jsonObject.insert("Key","K文件");jsonObject.insert("Value",jsonArray);QJsonDocument jsonDoc(jsonObject);//将QJsonObject转换为JSON格式的字符串。QString jsonData = jsonDoc.toJson(QJsonDocument::Compact);tcpSocket->write(jsonData.toUtf8());
}
void MainWindow::msg()//发送消息
{
//发送字符串QString name="驾驶员";tcpSocket->write(name.toUtf8());qDebug()<<name.toUtf8();
}
MainWindow::~MainWindow()
{delete ui;
}
void MainWindow::onConnected()
{// 连接建立时的处理qDebug()<<"连接以建立";
}
void MainWindow::onDisconnected()
{// 连接断开时的处理qDebug()<<"连接断开";
}
void MainWindow::onReadyRead()
{// 接收到数据时的处理QByteArray receivedData = tcpSocket->readAll();QString receivedString = QString::fromUtf8(receivedData);//转换成正确的string格式qDebug()<<"接受的数据是 "+receivedString;    
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/152737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工作记录---为什么双11当天不能申请退款?(有趣~)

为什么&#xff1f; 服务降级了 服务降级&#xff1a; 当服务器压力剧增的情况下&#xff0c;根据实际业务情况及流量&#xff0c;对一些服务和页面有策略的不处理或换种简单的方式处理&#xff0c;从而释放服务器资源以保证核心交易正常运作或高效运作。 分布式系统的降级…

用Java实现贪吃蛇小游戏

一、创建新项目 首先创建一个新的项目&#xff0c;并命名为贪吃蛇。 其次在贪吃蛇项目下创建一个名为images的文件夹用来存放游戏相关图片。 然后再在项目的src文件下创建一个com.xxx.view的包用来存放所有的图形界面类&#xff0c;创建一个com.xxx.controller的包用来存放启…

基于AVR单片机的心电信号获取与分析

基于AVR单片机的心电信号获取与分析是一项常见的生物医学工程应用&#xff0c;用于监测和分析人体的心脏活动。本文将介绍基于AVR单片机的心电信号获取与分析的原理和设计&#xff0c;并提供相应的代码示例。 1. 概述 心电信号是记录和分析心脏电活动的重要手段。AVR单片机是…

04.webpack中css的压缩和抽离

1.抽离css文件 利用mini-css-extract-plugin插件&#xff0c;替代style-loader const MiniCssExtractPlugin require(mini-css-extract-plugin) module.exports smart(webpackCommonConf, {mode: production,output: {// filename: bundle.[contentHash:8].js, // 打包代码…

Oracle Data Redaction和Oracle Data Pump

本实验的使用环境基于之前的博客&#xff1a;一个简单的Oracle Redaction实验 本实验参考文档为15.14 Oracle Data Redaction and Oracle Data Pump 先创建directory并赋权&#xff1a; -- connect to database or pluggable database alter session set containerorclpdb1;…

mysql 中with的用法(3)

有表&#xff08;tb&#xff09;,数据如下&#xff1a; 请用SQL,生成如下的样式&#xff1a; 一、建表 CREATE TABLE tb (id varchar(3) DEFAULT NULL,pid varchar(3) DEFAULT NULL,name varchar(64) DEFAULT NULL ) INSERT INTO tb (id, pid, name) VALUES(002, 0, 浙江省)…

docker更换国内源

docker更换国内源 1、编辑Docker配置文件 在终端中执行以下命令&#xff0c;编辑Docker配置文件&#xff1a; vi /etc/docker/daemon.json2、添加更新源 在打开的配置文件中&#xff0c;添加以下内容&#xff1a; {"registry-mirrors": ["https://hub-mirror…

Chrome中设置安全来源域名

目的&#xff1a; 使得本地映射的域名能被浏览器安全访问&#xff0c;允许调用设备资源 步骤&#xff1a; 在Chrome中导航栏打开 chrome://flags/#unsafely-treat-insecure-origin-as-secure 填入hosts域名&#xff1a;如 http://h5-twzc003.local.com 参考&#xff1a; h…

赴日开发工程师是做什么的?

日本的软件开发岗位对技术要求和沟通能力都有较高的要求&#xff0c;赴日开发工程师主要负责软件设计、开发和测试&#xff0c;包括编写代码、测试代码和修复漏洞等工作。开发人员必须对软件架构、设计模式和业务逻辑有深入的理解&#xff0c;并能做出合适的技术决策。 当然&a…

时间序列与 Statsmodels:预测所需的基本概念(1)

后文&#xff1a;时间序列与 statsmodels&#xff1a;预测所需的基本概念&#xff08;2&#xff09;-CSDN博客 一、说明 本博客解释了理解时间序列的基本概念&#xff1a;趋势、季节性、白噪声、平稳性&#xff0c;并使用自回归、差分和移动平均参数进行预测示例。这是理解任何…

江湖再见,机器视觉兄弟们,我已经提离职了,聪明的机器视觉工程师,离职不亏本!

我闻江湖已叹息&#xff0c;又闻人间繁闹闹。同为布衣沦落人&#xff0c;相逢何必曾相识。 此生谁料事事休&#xff0c;道不尽人情冷暖&#xff0c;聚散离合总平常&#xff0c;不似勇气少年时。 我估计今年公司年底是发不出工资了&#xff0c;因为订单续不上。年终奖更是没有&…

鸢尾花分类

第1关&#xff1a;什么是决策树 1.AB 2.B 第2关&#xff1a;信息熵与信息增益 import numpy as npdef calcInfoGain(feature, label, index):计算信息增益:param feature:测试用例中字典里的feature&#xff0c;类型为ndarray:param label:测试用例中字典里的label&#xf…

Android 弹出自定义对话框

Android在任意Activity界面弹出一个自定义的对话框&#xff0c;效果如下图所示: 准备一张小图片&#xff0c;右上角的小X图标64*64&#xff0c;close_icon.png&#xff0c;随便找个小图片代替&#xff1b; 第一步&#xff1a;样式添加&#xff0c;注意&#xff1a;默认在value…

Go 内存分配:结构体中的优化技巧

关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等&#xff0c;您的关注将是我的更新动力&#xff01; 在使用Golang进行内存分配时&#xff0c;我们需要遵循一系列规则。在深入了解这些规则之前&#xff0c;我们需要先了解变量的对齐…

通过微软MediaCreationTool制作Win10系统安装U盘,安装纯净版Win10的通用教程

最近新入手了一台Lenovo的入门级主机。 为了避免以后忘记装机步骤&#xff0c;特写下此博客记录。 装机步骤是在Lenovo网站上看的&#xff0c;在这表示感谢。 https://iknow.lenovo.com.cn/detail/177365

Ubuntu下发送邮件

mail命令在Ubuntu下是需要安装的&#xff0c;使用下条命令进行安装&#xff1a; sudo apt-get install heirloom-mailx 接下来输入用户密码&#xff0c;等待安装完成 此时还不能发送外部服务器邮件&#xff0c;需要完成以下配置&#xff0c;修改/etc/nail.rc或者/etc/s-nail.…

(十二)Flask重点之session

session 自我介绍&基本使用&#xff1a; 在Flask中&#xff0c;Session是一种用于在客户端和服务器之间存储和传输数据的机制。它允许您在用户与应用程序之间保持状态&#xff0c;并且可以存储和检索有关特定用户的信息。 Flask使用Werkzeug库提供的SecureCookie来实现S…

LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索Indexes for information retrieve

接着前面的Langchain&#xff0c;继续实现读取YouTube的视频脚本来问答Indexes for information retrieve LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗…

Python接口自动化(什么是接口、接口优势、类型)

简介 经常听别人说接口测试&#xff0c;接口测试自动化&#xff0c;但是你对接口&#xff0c;有多少了解和认识&#xff0c;知道什么是接口吗&#xff1f;它是用来做什么的&#xff0c;测试时候要注意什么&#xff1f;坦白的说&#xff0c;笔者之前也不是很清楚。接下来先看一下…

Python懒羊羊

目录 系列文章 写在前面 绘图基础 懒羊羊 写在后面 系列文章 序号文章目录直达链接表白系列1浪漫520表白代码https://want595.blog.csdn.net/article/details/1306668812满屏表白代码https://want595.blog.csdn.net/article/details/1297945183跳动的爱心https://want595…