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设置单元格字…...
电脑上可以写便签的软件哪些界面比较可爱且好用?
电脑上可以安装使用的便签类软件比较多,在选择使用电脑便签软件时,很多人对便签的外观界面还是比较在意的,一个好看的便签界面在一方面可以引起大家的注意,另一方面可以增加电脑桌面背景和便签类软件的协调性。 电脑便签软件通常…...
2021秋招-总目录
2021秋招-目录 知识点总结 预训练语言模型: Bert家族 1.1 BERT、attention、transformer理解部分 B站讲解–强烈推荐可视化推倒结合代码理解代码部分常见面试考点以及问题: word2vec 、 fasttext 、elmo;BN 、LN、CN、WNNLP中的loss与评价总结 4.1 loss_function࿱…...
HTML5生成二维码
H5生成二维码 前言二维码实现过程页面实现关键点全部源码 前言 本文主要讲解如何通过原生HTML、CSS、Js中的qrcodejs二维码生成库,实现一个输入URL按下回车后输出URL。文章底部有全部源码,需要可以自取。 实现效果图: 上述实现效果为&#…...
大数据-之LibrA数据库系统告警处理(ALM-25005 Nscd服务异常)
告警解释 系统每60秒周期性检测nscd服务的状态,如果连续4次(3分钟)查询不到nscd进程或者无法获取ldapserver中的用户时,产生该告警。 当进程恢复且可以获取ldapserver中的用户时,告警恢复。 告警属性 告警ID 告警级…...
NLP:使用 SciKit Learn 的文本矢量化方法
一、说明 本文是使用所有 SciKit Learns 预处理方法生成文本数字表示的深入解释和教程。对于以下每个矢量化器,将给出一个简短的定义和实际示例:one-hot、count、dict、TfIdf 和哈希矢量化器。 SciKit Learn 是一个用于机器学习项目的广泛库,…...
这些仪表板常用的数据分析模型,你都见过吗?
本文由葡萄城技术团队发布。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 ##前言 在数字化时代,数据已经成为了企业决策和管理的重要依据。而仪表板作为一种数据可视化工具&#x…...
【Proteus仿真】【Arduino单片机】多功能数字时钟设计
文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器,使用PCF8574、LCD1602液晶、DS1302温度传感器、DS1302时钟、按键、蜂鸣器等。 主要功能: 系统运行后,LCD1602显示当前日期…...
c语言回文数
以下是用C语言编写的回文数代码: #include <stdio.h>int main() { int num, reversedNum 0, remainder, originalNum; printf("请输入一个正整数:"); scanf("%d", &num); originalNum num; while (num …...
【学习记录】从0开始的Linux学习之旅——编译linux内核
一、学习背景 从接触嵌入式至今,除了安装过双系统接触了一丢丢linux外,linux在我眼中向来是个传说。而如今得到了一块树莓派,于是决心把linux搞起来。 二、概念学习 Linux操作系统通常是基于Linux内核,并结合GNU项目中的工具和应…...
uni-app - 日期 · 时间选择器
目录 1.基本介绍 2.案例介绍 ①注意事项: ②效果展示 3.代码展示 ①view部分 ②js部分 ③css样式 1.基本介绍 从底部弹起的滚动选择器。支持五种选择器,通过mode来区分,分别是普通选择器,多列选择器,时间选择器&a…...
使用USB转JTAG芯片CH347在Vivado下调试
简介 高速USB转接芯片CH347是一款集成480Mbps高速USB接口、JTAG接口、SPI接口、I2C接口、异步UART串口、GPIO接口等多种硬件接口的转换芯片。 通过XVC协议,将CH347应用于Vivado下,简单尝试可以成功,源码如下,希望可以一起共建&a…...
硬技能之上的软技巧(三)
在硬技能的基础上,如何运用软技巧来进一步提升个人能力和职业发展。在之前的讨论中,我们提到了硬技能和软技巧的基本概念,以及如何运用软技巧来提升个人能力和职业发展。本篇文章将进一步探讨软技巧中的一些重要方面,包括自我管理…...
mysql 查询
-- 多表查询select * from tb_dept,tb_emp; 内来链接 -- 内连接 -- A 查询员工的姓名 , 及所属的部门名称 (隐式内连接实现)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中的过程宏有三个风格…...
数据分析:数据预处理流程及方法
数据预处理是数据分析过程中至关重要的一步,它涉及到清洗、转换和整理原始数据,以便更好地适应分析模型或算法。以下是一些常见的数据预处理方法和规则: 数据清洗: 处理缺失值:检测并处理数据中的缺失值,可…...
uniapp 防抖节流封装和使用
防抖(debounce):定义一个时间,延迟n秒执行,n秒内再次调用,会重新计时,计时结束后才会再次执行 主要运用场景: 输入框实时搜索:在用户输入内容的过程中,使用防抖可以减少频繁的查询…...
springcloud alibaba学习视频
阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台...
【MySQL】一些内置函数(时间函数、字符串函数、数学函数等,学会了有妙用)
内置函数 前言正式开始时间函数显示当前日期、时间、日期时间的日期计算相差多少天示例创建一张表,记录生日 留言表 字符串函数charsetconcatinstr(string, substring)ucase和lcaseleft(string, length)length求字符串长度replace(str, search_str, replace_str)tri…...
【计算机网络】第22篇:传输层安全——TLS握手协议的状态机与密钥派生
目录 1. TLS在协议栈中的位置 2. TLS 1.3握手的两种模式 2.1 (EC)DHE握手:一个往返的密钥交换 2.2 PSK握手:零往返的会话恢复 3. HKDF密钥派生链 3.1 从共享秘密到会话密钥 3.2 密钥分离与方向隔离 4. 前向安全性与0-RTT的张力 4.1 前向安全性的…...
别再为IEEE论文发愁!Overleaf里搞定中文排版,XeLaTeX+CTeX保姆级配置
学术写作新手的救星:Overleaf中完美实现IEEE论文中文排版 第一次在Overleaf上使用IEEE模板写中文论文时,我盯着屏幕上那串乱码足足发呆了五分钟。作为过来人,我完全理解那种绝望感——明明是按照官方文档一字不差地操作,为什么中文…...
PotPlayer字幕翻译终极指南:免费实现实时双语字幕的完整教程
PotPlayer字幕翻译终极指南:免费实现实时双语字幕的完整教程 【免费下载链接】PotPlayer_Subtitle_Translate_Baidu PotPlayer 字幕在线翻译插件 - 百度平台 项目地址: https://gitcode.com/gh_mirrors/po/PotPlayer_Subtitle_Translate_Baidu 还在为观看外语…...
【U-Desk】本地、SFTP、云OSS 一站式文件维护
简介:U-Desk:BGM音乐 (本地、云服务器SFTP、云云存储OSS)一站式文件维护,远程文件操作与本机文件一致;桌面应用,身材小巧,打包体积 不到10M, 运行内存10M,启动~1秒&#…...
Winodws系统sqlwoa.dll文件丢失无法启动程序解决
在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…...
Universal x86 Tuning Utility技术架构深度解析:跨平台硬件调优实现原理与工程实践
Universal x86 Tuning Utility技术架构深度解析:跨平台硬件调优实现原理与工程实践 【免费下载链接】Universal-x86-Tuning-Utility Unlock the full potential of your Intel/AMD based device. 项目地址: https://gitcode.com/gh_mirrors/un/Universal-x86-Tuni…...
Linux RT 调度器的 rt_rq:RT 运行队列的结构与管理
一、简介在 Linux 内核调度体系中,调度子系统是整个操作系统进程管理的核心骨架,而实时调度(SCHED_FIFO/SCHED_RR) 是工业控制、车载自动驾驶、宇航嵌入式、音视频实时编解码、工业网关等硬实时场景的底层支撑。普通 CFS 调度器追…...
前端光标交互深度实践:从CSS属性到无障碍访问的完整指南
1. 项目概述与核心价值最近在整理个人项目时,我重新审视了一个几年前启动但一直觉得很有意思的仓库:seanpm2001/Computer-cursor-tech-support_Website。光看这个标题,你可能会有点摸不着头脑——“计算机光标技术支持网站”?这听…...
D2DX终极指南:让《暗黑破坏神2》在现代PC上焕然新生的完整教程
D2DX终极指南:让《暗黑破坏神2》在现代PC上焕然新生的完整教程 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx D…...
深入紫光FPGA视频流:手把手解析纯Verilog实现的DDR3图像缓存架构与HDMI输出时序
紫光FPGA视频流处理:纯Verilog实现DDR3缓存与HDMI输出的核心架构解析 在FPGA视频处理系统中,图像缓存与输出时序控制往往是决定系统性能的关键环节。本文将聚焦紫光同创PGL100G系列FPGA,深入剖析两个核心技术模块:基于纯Verilog实…...
