当前位置: 首页 > news >正文

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;    
}

相关文章:

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 ShowUnity…...

QTableView/QTableWidget设置单元格字体颜色及背景色

1.QTableView设置单元格字体颜色及背景色 QStandardItem * pItem new QStandardItem("AAA"); pItem->setBackground(QBrush(Qt::blue)); // 设置背景色 pItem->setForeground(QBrush(Qt::red)); // 设置字体颜色 2.QTableWidget设置单元格字…...

电脑上可以写便签的软件哪些界面比较可爱且好用?

电脑上可以安装使用的便签类软件比较多&#xff0c;在选择使用电脑便签软件时&#xff0c;很多人对便签的外观界面还是比较在意的&#xff0c;一个好看的便签界面在一方面可以引起大家的注意&#xff0c;另一方面可以增加电脑桌面背景和便签类软件的协调性。 电脑便签软件通常…...

2021秋招-总目录

2021秋招-目录 知识点总结 预训练语言模型: Bert家族 1.1 BERT、attention、transformer理解部分 B站讲解–强烈推荐可视化推倒结合代码理解代码部分常见面试考点以及问题: word2vec 、 fasttext 、elmo;BN 、LN、CN、WNNLP中的loss与评价总结 4.1 loss_function&#xff1…...

HTML5生成二维码

H5生成二维码 前言二维码实现过程页面实现关键点全部源码 前言 本文主要讲解如何通过原生HTML、CSS、Js中的qrcodejs二维码生成库&#xff0c;实现一个输入URL按下回车后输出URL。文章底部有全部源码&#xff0c;需要可以自取。 实现效果图&#xff1a; 上述实现效果为&#…...

大数据-之LibrA数据库系统告警处理(ALM-25005 Nscd服务异常)

告警解释 系统每60秒周期性检测nscd服务的状态&#xff0c;如果连续4次&#xff08;3分钟&#xff09;查询不到nscd进程或者无法获取ldapserver中的用户时&#xff0c;产生该告警。 当进程恢复且可以获取ldapserver中的用户时&#xff0c;告警恢复。 告警属性 告警ID 告警级…...

NLP:使用 SciKit Learn 的文本矢量化方法

一、说明 本文是使用所有 SciKit Learns 预处理方法生成文本数字表示的深入解释和教程。对于以下每个矢量化器&#xff0c;将给出一个简短的定义和实际示例&#xff1a;one-hot、count、dict、TfIdf 和哈希矢量化器。 SciKit Learn 是一个用于机器学习项目的广泛库&#xff0c;…...

这些仪表板常用的数据分析模型,你都见过吗?

本文由葡萄城技术团队发布。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 ##前言 在数字化时代&#xff0c;数据已经成为了企业决策和管理的重要依据。而仪表板作为一种数据可视化工具&#x…...

【Proteus仿真】【Arduino单片机】多功能数字时钟设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用PCF8574、LCD1602液晶、DS1302温度传感器、DS1302时钟、按键、蜂鸣器等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示当前日期…...

c语言回文数

以下是用C语言编写的回文数代码&#xff1a; #include <stdio.h>int main() { int num, reversedNum 0, remainder, originalNum; printf("请输入一个正整数&#xff1a;"); scanf("%d", &num); originalNum num; while (num …...

【学习记录】从0开始的Linux学习之旅——编译linux内核

一、学习背景 从接触嵌入式至今&#xff0c;除了安装过双系统接触了一丢丢linux外&#xff0c;linux在我眼中向来是个传说。而如今得到了一块树莓派&#xff0c;于是决心把linux搞起来。 二、概念学习 Linux操作系统通常是基于Linux内核&#xff0c;并结合GNU项目中的工具和应…...

uni-app - 日期 · 时间选择器

目录 1.基本介绍 2.案例介绍 ①注意事项&#xff1a; ②效果展示 3.代码展示 ①view部分 ②js部分 ③css样式 1.基本介绍 从底部弹起的滚动选择器。支持五种选择器&#xff0c;通过mode来区分&#xff0c;分别是普通选择器&#xff0c;多列选择器&#xff0c;时间选择器&a…...

使用USB转JTAG芯片CH347在Vivado下调试

简介 高速USB转接芯片CH347是一款集成480Mbps高速USB接口、JTAG接口、SPI接口、I2C接口、异步UART串口、GPIO接口等多种硬件接口的转换芯片。 通过XVC协议&#xff0c;将CH347应用于Vivado下&#xff0c;简单尝试可以成功&#xff0c;源码如下&#xff0c;希望可以一起共建&a…...

硬技能之上的软技巧(三)

在硬技能的基础上&#xff0c;如何运用软技巧来进一步提升个人能力和职业发展。在之前的讨论中&#xff0c;我们提到了硬技能和软技巧的基本概念&#xff0c;以及如何运用软技巧来提升个人能力和职业发展。本篇文章将进一步探讨软技巧中的一些重要方面&#xff0c;包括自我管理…...

mysql 查询

-- 多表查询select * from tb_dept,tb_emp; 内来链接 -- 内连接 -- A 查询员工的姓名 &#xff0c; 及所属的部门名称 &#xff08;隐式内连接实现&#xff09;select tb_emp.name,tb_dept.name from tb_emp,tb_dept where tb_emp.idtb_emp.id;-- 推荐使用select a.name,b.n…...

2311rust过程宏的示例

原文 Rust2018中的过程宏 在Rust2018版本中,我最喜欢的功能是过程宏.在Rust中,过程宏有着悠久而传奇的历史(并继续拥有传奇的未来!) 因为2018年版极大改善了定义和使用它们的体验. 什么是过程宏 过程宏是,在编译时用一段语法,生成新语法的函数.Rust2018中的过程宏有三个风格…...

数据分析:数据预处理流程及方法

数据预处理是数据分析过程中至关重要的一步&#xff0c;它涉及到清洗、转换和整理原始数据&#xff0c;以便更好地适应分析模型或算法。以下是一些常见的数据预处理方法和规则&#xff1a; 数据清洗&#xff1a; 处理缺失值&#xff1a;检测并处理数据中的缺失值&#xff0c;可…...

uniapp 防抖节流封装和使用

防抖(debounce)&#xff1a;定义一个时间&#xff0c;延迟n秒执行&#xff0c;n秒内再次调用&#xff0c;会重新计时&#xff0c;计时结束后才会再次执行 主要运用场景&#xff1a; 输入框实时搜索&#xff1a;在用户输入内容的过程中&#xff0c;使用防抖可以减少频繁的查询…...

springcloud alibaba学习视频

阿里云登录 - 欢迎登录阿里云&#xff0c;安全稳定的云计算服务平台...

【MySQL】一些内置函数(时间函数、字符串函数、数学函数等,学会了有妙用)

内置函数 前言正式开始时间函数显示当前日期、时间、日期时间的日期计算相差多少天示例创建一张表&#xff0c;记录生日 留言表 字符串函数charsetconcatinstr(string, substring)ucase和lcaseleft(string, length)length求字符串长度replace(str, search_str, replace_str)tri…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...