当前位置: 首页 > 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回归是一种广泛应用…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

WEB3全栈开发——面试专业技能点P7前端与链上集成

一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染&#xff08;SSR&#xff09;与静态网站生成&#xff08;SSG&#xff09; 框架&#xff0c;由 Vercel 开发。它简化了构建生产级 React 应用的过程&#xff0c;并内置了很多特性&#xff1a; ✅ 文件系…...