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
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐: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 概述 简介: Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架。与其他…...
数据结构——二叉树的基本概念及顺序存储(堆)
目录 一.前言 二.树概念及结构 2.1 树的概念 2.2 树的相关概念 2.3 树的表现 2.4 树在实际中的应用(表示文件系统的目录树结构) 三.二叉树的概念及结构 3.1 概念 3.2 特殊的二叉树 3.3 二叉树的性质 3.4 二叉树的存储结构 3.4.1 顺序存储 3…...
acwing算法基础之基础算法--整数二分算法
目录 1 知识点2 代码模板 1 知识点 有单调性一定可以二分,但在某些情况下,不具有单调性也可以二分。 单调性也可以抽象成某类性质,分界点左边不满足此性质,而右边满足此性质。当然也可以分界点左边满足此性质,而右边不…...
windows C 开发
在win下用C/C开发 非图形界面 应用程序 基础环境包括3个内容1. API : 一般是系统(包括c标准库和其他dll)提供的2. 编译器 : 可以是gnu的,可以是微软提供的3. 编辑器 : 随意都可以 // 不再考虑范围开发方式(API编译器) 原生windows API 使用 Windows API 来编写非视窗代码。…...
C语言——动态内存管理详解(内存结构、动态内存函数、易错题、柔性数组)
本篇概要 本篇文章从基本出发讲述为什么要存在动态内存分配,动态内存函数有哪些,常见的动态内存错误,一些关于内存分配的练习题以及柔性数组的相关知识。 文章目录 本篇概要1.为什么存在动态内存分配1.1为什么要动态分配内存1.2内存结构 2.常…...
2023年全国控制科学与工程学科评估结果 - 自动化考研
考研选择学校时,控制科学与工程考研学校排名情况怎样是广大考研学子十分关心的问题,以下是我们自动化考研联盟为大家整理得最新控制科学与工程学科评估结果情况,还比较权威,供大家参考。 最后祝大家一战成硕,有其他问题欢迎评论区…...
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 实现数字验证码功能
需求:写了一个 手机发送验证码后 输入固定验证码的功能 封装成一个组件,如下: <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(0.61mm))内直径为12mil(0.305mm) 嘉立创PCB工艺加工能力范围说明-嘉立…...
淘宝商品详情接口数据采集用于上货,无货源选品上货,采集淘宝天猫商品详情数据
淘宝商品详情接口数据采集可用于上货。先通过关键字搜索接口,抓取到批量的商品ID,再将商品ID传入商品详情数据采集接口的请求参数中,从而达到批量抓取商品详情数据的功能。 接口名称:item_get,获取商品详情数据&#…...
DoS和DDos攻攻击
介绍 DDoS 和 DoS 攻击是我们最常见的网络攻击之一,而且历史相当悠久,算是很经典的两种攻击方式,但它们实际上是如何运作的呢? 虽然两者基本上都能够让工作停摆,但其中有很大的差异,接下来我们将逐一说明&a…...
Python实时采集Windows CPU\MEMORY\HDD使用率
文章目录 安装psutil库在Python脚本中导入psutil库获取CPU当前使用率,并打印结果获取内存当前使用率,并打印结果获取磁盘当前使用情况,并打印结果推荐阅读 要通过Python实时采集Windows性能计数器的数据,你可以使用psutil库。psut…...
【改造中序遍历算法】1038. 从二叉搜索树到更大和树
1038. 从二叉搜索树到更大和树 解题思路 改造中序遍历算法先遍历右子树 然后累加当前节点的值 再遍历左子树 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode…...
克服网络安全压力:如何掌控无限的云数据
管理云中的数字风险比以往任何时候都更加重要。数字化转型引发的云数据呈指数级增长,为安全分析师创造了一个更大的威胁环境。随着威胁行为者继续危害组织最敏感的数据,这一挑战将会加剧。 预计未来五年全球网络犯罪成本将激增,从 2022 年的…...
【数据结构和算法】--N叉树中,返回某些目标节点到根节点的所有路径
目录 一、前言二、具体实现及拓展2.1、递归-目标节点到根节点的路径数据2.2、list转换为tree结构2.3、tree转换为list结构 一、前言 这么多年工作经历中,“数据结构和算法”真的是超重要,工作中很多业务都能抽象成某种数据结构问题。下面是项目中遇到的…...
进程和线程的区别 线程之间共享的资源
线程和进程都是操作系统中的执行单位,但它们在以下几个方面存在区别: 相同处: 1.执行环境:线程和进程都有自己的执行上下文,包括程序计数器、寄存器和栈,可以独立执行指令。 2.并发性:线程和进…...
基于Matlab实现logistic方法(源码+数据)
Logistic回归是一种常用的分类算法,适用于二分类问题。本文将介绍如何使用Matlab实现Logistic回归方法,并通过一个示例演示其应用。 文章目录 引言实现步骤1. 数据准备2. 特征缩放3. 模型训练4. 模型评估 源码数据下载 引言 Logistic回归是一种广泛应用…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
