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

ubuntu20.04.3中qt程序界面嵌套另一个qt界面

先上代码

#include "mainwindow.h"
#include <QApplication>
#include <iostream>
using namespace std;
#ifdef _WIN32// Windows 平台的代码
#include <windows.h>
#elif __linux__// Linux 平台的代码// ...#include <X11/Xlib.h>
#else// 其他平台的代码或错误处理// ...
#endif
QString cmd = QString("/home/lxk/Code/build-MyQtApp-Desktop_Qt_5_9_6_GCC_64bit-Debug/MyQtApp");#include <QThread>
#include <QWidget>
#include <QVBoxLayout>
#include <QLabel>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;//w.init();//w.show();QString cmd = QString("/home/lxk/Code/build-MyQtApp-Desktop_Qt_5_9_6_GCC_64bit-Debug/MyQtApp");;QProcess m_pProcess(&a);//m_pProcess.setProcessChannelMode(QProcess::MergedChannels);m_pProcess.start(cmd);WId wid2 = 0;//-- 只保证进程已经开始,但不保证进程的主窗口已经创建if (m_pProcess.waitForStarted()) {QThread::sleep(2);// 获取外部窗口句柄QStringList arguments;{arguments << "search";arguments << "--name" << "oop";QProcess xprop;xprop.start("xdotool", arguments);xprop.waitForFinished();//if(xprop.waitForFinished()){QByteArray byteArray = xprop.readAllStandardOutput();QString input = QString::fromUtf8(byteArray);QStringList numbers = input.trimmed().split("\n");QString tmp = numbers[0];wid2 = numbers[0].toULong();qDebug() << "WId2:" << wid2;//xdotool windowunmap 52428805arguments.clear();arguments << "windowunmap";arguments << tmp;xprop.start("xdotool", arguments);QWidget *container  = new QWidget;container->setMinimumSize(QSize(600,500));QLabel* label = new QLabel("Hello Kand");QWidget* pWidget2 = QWidget::createWindowContainer(QWindow::fromWinId(wid2));//pWidget2->setWindowFlags(pWidget2->windowFlags() | Qt::WindowStaysOnTopHint);// pWidget2->raise(); // 将窗口降低到最后面QVBoxLayout* layout = new QVBoxLayout(container);layout->addWidget(pWidget2);//layout->addWidget(label);container->setLayout(layout); // This is important, it sets the layout for the container widgetcontainer->show();}}}return a.exec();
}

一般情况下,宿主程序嵌入子程序的思路是个window下的思路是一样的。
1.也是先启动程序

    QString cmd = QString("/home/Code/build-MyQtApp-Desktop_Qt_5_9_6_GCC_64bit-Debug/MyQtApp");;QProcess m_pProcess(&a);//m_pProcess.setProcessChannelMode(QProcess::MergedChannels);m_pProcess.start(cmd);WId wid2 = 0;

2.找到窗口句柄

      if (m_pProcess.waitForStarted()) {QThread::sleep(2);// 获取外部窗口句柄QStringList arguments;{arguments << "search";arguments << "--name" << "oop";QProcess xprop;xprop.start("xdotool", arguments);xprop.waitForFinished();//if(xprop.waitForFinished()){QByteArray byteArray = xprop.readAllStandardOutput();QString input = QString::fromUtf8(byteArray);QStringList numbers = input.trimmed().split("\n");QString tmp = numbers[0];wid2 = numbers[0].toULong();qDebug() << "WId2:" << wid2;

xdotool search --name oop
这个oop是WindowTitle

3.设置窗口的状态(有的系统不需要设置窗口的状态,比如window10不设置窗口状态,也可以嵌入)很重要。

                      //xdotool windowunmap 52428805arguments.clear();arguments << "windowunmap";arguments << tmp;xprop.start("xdotool", arguments);

4.然后常规的嵌入就ok了

QWidget* pWidget2 = QWidget::createWindowContainer(QWindow::fromWinId(wid2));//pWidget2->setWindowFlags(pWidget2->windowFlags() | Qt::WindowStaysOnTopHint);// pWidget2->raise(); // 将窗口降低到最后面QVBoxLayout* layout = new QVBoxLayout(container);layout->addWidget(pWidget2);//layout->addWidget(label);container->setLayout(layout); // This is important, it sets the layout for the container widgetcontainer->show();

相关命令如下:

 WindowTitle不要重名;
xdotool search --name oop 查看WindowTitle为oop的窗口的id
xprop -id <window_id> WM_STATE   查看这个窗口的状态
比如:
(base) l@ubuntu:~/Desktop$ xprop -id 52428805 WM_STATE
WM_STATE(WM_STATE):window state: Normalicon window: 0x0改变这个窗口的状态
xdotool windowunmap 52428805

上文需要在系统中安装一些工具。
下文可以不用看!
Ps: 一个进程可以管理程序的多个窗口,我的测试代码如下,不知为何我检测到两个MyQtApp,我没有深究,可能原本启动一个程序,个人猜测 ------然后在嵌入的时候又复制了一个吧,不清楚!反正不对!也许把窗口状态改变就可以了。 我没试。

        #ifdef _WIN32// Windows 平台的代码wid = (WId)FindWindow(L"UnityWndClass", nullptr);#elif __linux__//-- XOpenDisplay 允许你的程序与 X Window System 进行通信,从而实现图形界面交互。Display* display = XOpenDisplay(NULL);if (display == NULL) {fprintf(stderr, "无法打开显示\n");return 1;}//-- "根窗口"是一个特殊的窗口,它是所有其他窗口的祖先。所有的窗口,无论是顶级窗口还是子窗口,都是从根窗口派生出来的。//-- 在大多数情况下,根窗口是整个屏幕或整个显示设备。Window root = DefaultRootWindow(display);Window root_return, parent_return;Window* children;unsigned int num_children;if (XQueryTree(display, root, &root_return, &parent_return, &children, &num_children)) {for (unsigned int i = 0; i < num_children; i++) {char* name = NULL;if (XFetchName(display, children[i], &name)) {qDebug() << "name:" << name;//if (name != NULL && strcmp(name, "gnome-calculator") == 0) {if (name != NULL && strcmp(name, "MyQtApp") == 0) {wid = children[i];XFree(name);break;}XFree(name);}}XFree(children);}if (wid == 0) {fprintf(stderr, "未找到指定窗口\n");XCloseDisplay(display);return 1;}else{//窗口的名字是"MyQtApp",那么会将这个窗口的ID赋值给wid,否则wid会是无效的。所以,如果窗口的名字是"MyQtApp",那么pWindow应该是有效的。//在使用 Xlib(X Window System 的 C 语言库)时,你需要通过 XOpenDisplay 函数来打开一个连接到 X Server 的会话。//这个会话会在你的程序运行期间保持打开状态,直到你显式地关闭它。//但是,需要注意的是,你在代码中使用了XCloseDisplay(display);来关闭display。在调用XCloseDisplay后,所有与这个display相关的资源都应该被释放。CloseDisplay(display) 就是用于关闭这个连接的函数调用。在你的代码中,display 是一个指向 Display 结构体的指针,它代表了与 X Server 的连接。关闭连接是一个良好的做法,因为它会释放与 X Server 的通信资源,并且可以确保你的程序在退出时不会留下未关闭的连接。XCloseDisplay(display);// 现在你可以使用 'wid' 变量来操作该窗口qDebug() << "Window ID:" << wid;}#else// 其他平台的代码或错误处理// ...#endif

相关文章:

ubuntu20.04.3中qt程序界面嵌套另一个qt界面

先上代码 #include "mainwindow.h" #include <QApplication> #include <iostream> using namespace std; #ifdef _WIN32// Windows 平台的代码 #include <windows.h> #elif __linux__// Linux 平台的代码// ...#include <X11/Xlib.h> #else…...

【chainlit】使用chainlit部署chatgpt

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…...

测开 | Vue速查知识点

文章目录 Vue知识1. Vue 概述2. Vue 代码格式3. Vue 指令3.1 v-bind & v-model3.2 v-on3.3 v-if和v-show3.4 v-for 4. 生命周期 Vue知识 1. Vue 概述 简介&#xff1a; Vue.js&#xff08;读音 /vjuː/, 类似于 view&#xff09; 是一套构建用户界面的 渐进式框架。与其他…...

数据结构——二叉树的基本概念及顺序存储(堆)

目录 一.前言 二.树概念及结构 2.1 树的概念 2.2 树的相关概念 2.3 树的表现 2.4 树在实际中的应用&#xff08;表示文件系统的目录树结构&#xff09; 三.二叉树的概念及结构 3.1 概念 3.2 特殊的二叉树 3.3 二叉树的性质 3.4 二叉树的存储结构 3.4.1 顺序存储 3…...

acwing算法基础之基础算法--整数二分算法

目录 1 知识点2 代码模板 1 知识点 有单调性一定可以二分&#xff0c;但在某些情况下&#xff0c;不具有单调性也可以二分。 单调性也可以抽象成某类性质&#xff0c;分界点左边不满足此性质&#xff0c;而右边满足此性质。当然也可以分界点左边满足此性质&#xff0c;而右边不…...

windows C 开发

在win下用C/C开发 非图形界面 应用程序 基础环境包括3个内容1. API : 一般是系统(包括c标准库和其他dll)提供的2. 编译器 : 可以是gnu的,可以是微软提供的3. 编辑器 : 随意都可以 // 不再考虑范围开发方式(API编译器) 原生windows API 使用 Windows API 来编写非视窗代码。…...

C语言——动态内存管理详解(内存结构、动态内存函数、易错题、柔性数组)

本篇概要 本篇文章从基本出发讲述为什么要存在动态内存分配&#xff0c;动态内存函数有哪些&#xff0c;常见的动态内存错误&#xff0c;一些关于内存分配的练习题以及柔性数组的相关知识。 文章目录 本篇概要1.为什么存在动态内存分配1.1为什么要动态分配内存1.2内存结构 2.常…...

2023年全国控制科学与工程学科评估结果 - 自动化考研

考研选择学校时&#xff0c;控制科学与工程考研学校排名情况怎样是广大考研学子十分关心的问题&#xff0c;以下是我们自动化考研联盟为大家整理得最新控制科学与工程学科评估结果情况&#xff0c;还比较权威&#xff0c;供大家参考。 最后祝大家一战成硕,有其他问题欢迎评论区…...

React wangEditor5 使用说明

1、支持包安装 yarn add wangeditor/editor # 或者 npm install wangeditor/editor --saveyarn add wangeditor/editor-for-react # 或者 npm install wangeditor/editor-for-react --save2、使用 import wangeditor/editor/dist/css/style.css // 引入 cssimport { useState…...

vue 实现数字验证码功能

需求&#xff1a;写了一个 手机发送验证码后 输入固定验证码的功能 封装成一个组件,如下: <template><div class"conts"><div class"box"><div class"code_list"><div :class"[ code_item, hideIndex 0 ? co…...

【计算机网络】HTTP协议详解(举例解释,超级详细)

文章目录 一、HTTP协议简单介绍 1、1 什么是HTTP协议 1、2 再次理解“协议” 二、HTTP请求 2、1 HTTP的工作过程 2、1、1 demo代码 2、2 URL 介绍 2、2、1 urlencode 和 urldecode 2、3 HTTP 请求格式 三、HTTP响应 3、1 响应demo 3、2 HTTP 响应格式 四、HTTP 请求和响应中的…...

PCB放置过孔技巧

合理的放置过孔能有效的节约面积。 我们根据嘉立创的pcb工艺能力中写出单双面板最小过孔为0.3mm(内径)/0.5mm(外径) 设置过孔尺寸外直径为24mil&#xff08;0.61mm&#xff09;&#xff09;内直径为12mil&#xff08;0.305mm&#xff09; 嘉立创PCB工艺加工能力范围说明-嘉立…...

淘宝商品详情接口数据采集用于上货,无货源选品上货,采集淘宝天猫商品详情数据

淘宝商品详情接口数据采集可用于上货。先通过关键字搜索接口&#xff0c;抓取到批量的商品ID&#xff0c;再将商品ID传入商品详情数据采集接口的请求参数中&#xff0c;从而达到批量抓取商品详情数据的功能。 接口名称&#xff1a;item_get&#xff0c;获取商品详情数据&#…...

DoS和DDos攻攻击

介绍 DDoS 和 DoS 攻击是我们最常见的网络攻击之一&#xff0c;而且历史相当悠久&#xff0c;算是很经典的两种攻击方式&#xff0c;但它们实际上是如何运作的呢&#xff1f; 虽然两者基本上都能够让工作停摆&#xff0c;但其中有很大的差异&#xff0c;接下来我们将逐一说明&a…...

Python实时采集Windows CPU\MEMORY\HDD使用率

文章目录 安装psutil库在Python脚本中导入psutil库获取CPU当前使用率&#xff0c;并打印结果获取内存当前使用率&#xff0c;并打印结果获取磁盘当前使用情况&#xff0c;并打印结果推荐阅读 要通过Python实时采集Windows性能计数器的数据&#xff0c;你可以使用psutil库。psut…...

【改造中序遍历算法】1038. 从二叉搜索树到更大和树

1038. 从二叉搜索树到更大和树 解题思路 改造中序遍历算法先遍历右子树 然后累加当前节点的值 再遍历左子树 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode…...

克服网络安全压力:如何掌控无限的云数据

管理云中的数字风险比以往任何时候都更加重要。数字化转型引发的云数据呈指数级增长&#xff0c;为安全分析师创造了一个更大的威胁环境。随着威胁行为者继续危害组织最敏感的数据&#xff0c;这一挑战将会加剧。 预计未来五年全球网络犯罪成本将激增&#xff0c;从 2022 年的…...

【数据结构和算法】--N叉树中,返回某些目标节点到根节点的所有路径

目录 一、前言二、具体实现及拓展2.1、递归-目标节点到根节点的路径数据2.2、list转换为tree结构2.3、tree转换为list结构 一、前言 这么多年工作经历中&#xff0c;“数据结构和算法”真的是超重要&#xff0c;工作中很多业务都能抽象成某种数据结构问题。下面是项目中遇到的…...

进程和线程的区别 线程之间共享的资源

线程和进程都是操作系统中的执行单位&#xff0c;但它们在以下几个方面存在区别&#xff1a; 相同处&#xff1a; 1.执行环境&#xff1a;线程和进程都有自己的执行上下文&#xff0c;包括程序计数器、寄存器和栈&#xff0c;可以独立执行指令。 2.并发性&#xff1a;线程和进…...

基于Matlab实现logistic方法(源码+数据)

Logistic回归是一种常用的分类算法&#xff0c;适用于二分类问题。本文将介绍如何使用Matlab实现Logistic回归方法&#xff0c;并通过一个示例演示其应用。 文章目录 引言实现步骤1. 数据准备2. 特征缩放3. 模型训练4. 模型评估 源码数据下载 引言 Logistic回归是一种广泛应用…...

官方定调:Token(词元)是智能时代“硬通货”,不懂它用AI要被淘汰!

文章介绍了Token&#xff08;词元&#xff09;的官方定义及其在智能时代的重要性。Token是AI处理和理解文本的基本单位&#xff0c;类似于AI的“母语”。文章解释了Token的来源和运作机制&#xff0c;特别是中文和英文Token计数的差异&#xff0c;以及如何计算文本的Token数量。…...

手把手教你用QGIS加载并可视化2025年北京OSM路网SHP数据(WGS84坐标系)

零基础实战&#xff1a;QGIS加载OSM路网数据的完整可视化流程 第一次打开QGIS时&#xff0c;面对满屏的工具栏和菜单选项&#xff0c;很多初学者都会感到无从下手。特别是当手头有一份刚下载的SHP格式路网数据时&#xff0c;如何正确加载、设置坐标系并进行基础可视化&#xff…...

10个企业级Windows自动化场景:pywinauto终极应用指南

10个企业级Windows自动化场景&#xff1a;pywinauto终极应用指南 【免费下载链接】pywinauto pywinauto/pywinauto: 一个 Python 库&#xff0c;用于自动化 Windows 应用程序。特点是提供了丰富的函数和类库&#xff0c;可以用于控制鼠标、键盘和菜单等元素&#xff0c;实现自动…...

AIGlasses_for_navigation精彩案例分享:真实视障用户过马路辅助语音引导记录

AIGlasses_for_navigation精彩案例分享&#xff1a;真实视障用户过马路辅助语音引导记录 1. 引言&#xff1a;当AI成为视障者的“眼睛” 想象一下&#xff0c;你站在一个繁忙的路口&#xff0c;耳边是呼啸而过的车流声&#xff0c;眼前却是一片模糊或黑暗。过马路&#xff0c…...

虚幻引擎+数字孪生:手把手搭建智慧校园三维可视化平台(附浙江工商大学实战案例)

虚幻引擎数字孪生&#xff1a;从零构建智慧校园三维可视化平台的完整指南 想象一下&#xff0c;清晨走进校园时&#xff0c;管理员已经在三维可视化平台上完成了安防巡查&#xff1b;教务主任通过热力图调整着今天的课程安排&#xff1b;后勤人员正根据实时数据优化能源分配——…...

基于MPC的双馈风机暂态过电压抑制策略研究

基于MPC的双馈风机暂态过电压抑制策略研究 摘要 弱电网条件下,双馈风机(DFIG)在电网故障清除瞬间易发生暂态过电压。传统矢量控制(VC)中,无功电流外环PI控制器存在响应滞后,导致无功功率回撤速度无法匹配系统电压的突变。本文提出一种基于模型预测控制(MPC)的转子侧…...

BGE-Reranker-v2-m3企业部署:高并发请求压力测试案例

BGE-Reranker-v2-m3企业部署&#xff1a;高并发请求压力测试案例 1. 项目背景与价值 在企业级RAG&#xff08;检索增强生成&#xff09;系统中&#xff0c;检索精度直接影响最终的回答质量。传统向量检索虽然快速&#xff0c;但容易受到关键词相似性的干扰&#xff0c;返回大…...

夏中谱加盟无界动力,助力具身智能发展

夏中谱入职无界动力&#xff0c;担重任开启新征程今日&#xff0c;无界动力宣布夏中谱正式加入&#xff0c;担任联合创始人兼联席CTO。这一任命使他全面负责基于世界模型的原生具身智能多模态大模型研发&#xff0c;以及数据闭环、云端仿真等核心技术基础设施的持续建设与升级。…...

Seelen-UI架构深度解析:5个高效定制技巧打造专业级Windows桌面环境

Seelen-UI架构深度解析&#xff1a;5个高效定制技巧打造专业级Windows桌面环境 【免费下载链接】Seelen-UI The Fully Customizable Desktop Environment for Windows 10/11. 项目地址: https://gitcode.com/GitHub_Trending/se/Seelen-UI Seelen-UI作为Windows平台上的…...

一篇看懂原理、工作流与实战落地:收藏这份 AI Agent 学习指南,小白也能轻松入门大模型!

本文深入浅出地介绍了 AI Agent 的核心概念、工作原理以及实际应用。文章首先明确了 Agent 的本质是一个循环&#xff0c;由 LLM、工具和记忆三部分组成&#xff0c;并强调了 Agent 并不神秘&#xff0c;只是“增强版 LLM”。接着&#xff0c;文章指出了并非所有问题都需要 Age…...