linux桌面软件(wps)内嵌到其他窗口

程序测试环境是:slackware系统,属于linux系统,有桌面(Xface Session)。系统镜像是:slackware64-15.0-install-dvd.iso。qt、c++代码实现。

程序功能:将已经打开的wps(word、pdf等都可以)软件界面内嵌到qt窗口里。

必要条件:slackware系统里需要安装wps、qt5开发工具,本篇文章不做详述。

编译说明:上图是测试demo编译时,在编译工程里加的依赖。 以下截图的部分代码,其他代码不做描述。

form.h:

#ifndef FORM_H
#define FORM_H#include <QWidget>
#include <QProcess>namespace Ui {
class Form;
}class Form : public QWidget
{Q_OBJECTpublic:explicit Form(QWidget *parent = nullptr);~Form();void find_window_id_in_tree();void find_window_id_by_class();void add_window_in_qt(WId id);private:Ui::Form *ui;QProcess *process;
};#endif // FORM_H

 form.cpp

#include "form.h"
#include "ui_form.h"
#include <QWindow>
#include <QVBoxLayout>
#include <QtX11Extras/QX11Info>
#include <xcb/xcb.h>
#include <QDebug>
#include <X11/Xlib.h> 
#include <X11/Xatom.h> 
#include <iostream>  
#include <vector>  
#include <string>  
#include <sstream>  
#include <fstream>Form::Form(QWidget *parent) :QWidget(parent),ui(new Ui::Form)
{ui->setupUi(this);find_window_id_in_tree();find_window_id_by_class();
}Form::~Form()
{delete ui;
}// 通过系统窗口树形结构去一层层遍历窗口(我这里没有遍历子窗口,如果找不到某个窗口,或许是因为是子窗口)
void Form::find_window_id_in_tree()
{Display *display = XOpenDisplay(nullptr);if (!display) {std::cerr << "Cannot open display\n";return;}Window root = DefaultRootWindow(display);Window parent, *children;unsigned int num_children;if (!XQueryTree(display, root, &root, &parent, &children, &num_children)) {return;}std::vector<Window> windows;windows.push_back(root);for (unsigned int i = 0; i < num_children; ++i) {windows.push_back(children[i]);}XFree(children);for (Window win : windows) {char* name;int status = XFetchName(display, win, &name);if (status == 1) {// 这里的win就是窗口的id,也是窗口的句柄值std::cout << "Found window name: " << name << " " << win << std::endl;if (std::string(name).find("wps") != std::string::npos) {
//                XFree(name);
//                return;}XFree(name);}// 递归检查子窗口(如果有的话)// 注意:这里为了简化示例,没有实现递归}
}// 将第三方软件(wps)窗口内嵌到qt窗口里
void Form::add_window_in_qt(WId id)
{QWindow *win = QWindow::fromWinId(id);QWidget *widget = QWidget::createWindowContainer(win);widget->setParent(this);QVBoxLayout *layout = new QVBoxLayout();layout->addWidget(widget);this->setLayout(layout);
}// 获取窗口id(句柄)(找到的另外一种比较快捷的拿到窗口句柄的方式)
void Form::find_window_id_by_class()
{Display* display = XOpenDisplay(NULL);if (!display) {std::cerr << "Failed to open display" << std::endl;return;}Atom netClientListAtom = XInternAtom(display, "_NET_CLIENT_LIST", False);Atom actualType;int format;unsigned long numItems, bytesAfter;unsigned char* data = NULL;int status = XGetWindowProperty(display, DefaultRootWindow(display),netClientListAtom, 0, ~0UL, False,AnyPropertyType,&actualType, &format, &numItems, &bytesAfter,&data);if (status == Success && actualType == XA_WINDOW) {Window* windows = reinterpret_cast<Window*>(data);for (unsigned long i = 0; i < numItems; ++i) {Window win = windows[i];Atom actualType;int format;unsigned long nitems;unsigned long bytes_after;unsigned char* prop_data = nullptr;// 获取WM_CLASS属性if (XGetWindowProperty(display, win, XInternAtom(display, "WM_CLASS", False), 0, 1024, False, XA_STRING,&actualType, &format, &nitems, &bytes_after, &prop_data) == Success) {std::string className(reinterpret_cast<char*>(prop_data));if (actualType == XA_STRING && className == "wpspdf") {std::cout << "Window class name for window " << win << ": " << className << std::endl;XFree(prop_data);add_window_in_qt(win);}}}} else {std::cerr << "Failed to get window list property" << std::endl;}if (data != NULL) {XFree(data);}XCloseDisplay(display);
}

代码需要说明的有如下几点:

1、wps在slackware 中安装好后,可以打开word、pdf、execl、ppt,他们分别对应的可执行文件是wps、wpspdf、et、wpp。

2、本次demo测试,是将pdf窗口内嵌到qt窗口。

3、代码逻辑有些随意,主要是用于测试。效果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/437566.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android SystemUI组件(09)唤醒亮屏 锁屏处理流程

该系列文章总纲链接&#xff1a;专题分纲目录 Android SystemUI组件 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节持续迭代之前章节的思维导图&#xff0c;主要关注左侧上方锁屏分析部分 唤醒亮屏 即可。 Power按键的处理逻辑最终是由PhoneWindowManager来…

Watchdog Timers(WDT)

文章目录 1. 介绍2. Feature List3. 概述3.1. Safety Watchdog3.2. CPU Watchdog 4. 看门狗定时器功能5. Endinit Functions5.1 Password Access to WDTxCON05.1.1 Static Password5.1.2 Automatic Password Sequencing 5.2 Check Access to WDTxCON05.3 Modify Access to WDTx…

[C++]使用C++部署yolov11目标检测的tensorrt模型支持图片视频推理windows测试通过

官方框架&#xff1a; https://github.com/ultralytics/ultralytics yolov8官方最近推出yolov11框架&#xff0c;标志着目标检测又多了一个检测利器&#xff0c;于是尝试在windows下部署yolov11的tensorrt模型&#xff0c;并最终成功。 重要说明&#xff1a;安装环境视为最基…

Tiny-universe手戳大模型TinyRAG--task4

TinyRAG 这个模型是基于RAG的一个简化版本&#xff0c;我们称之为Tiny-RAG。Tiny-RAG是一个基于RAG的简化版本&#xff0c;它只包含了RAG的核心功能&#xff0c;即Retrieval和Generation。Tiny-RAG的目的是为了帮助大家更好的理解RAG模型的原理和实现。 1. RAG 介绍 LLM会产…

Halcon基础系列1-基础算子

1 窗口介绍 打开Halcon 的主界面主要有图形窗口、算子窗口、变量窗口和程序窗口&#xff0c;可拖动调整位置&#xff0c;关闭后可在窗口下拉选项中找到。 2 显示操作 关闭-dev_close_window() 打开-dev_open_window (0, 0, 712, 512, black, WindowHandle) 显示-dev_display(…

超级干货:Air780E之RS485通信篇,你学会了吗?

今天&#xff0c;我们来学习低功耗4G模组Air780E的RS485通信&#xff0c;同学们&#xff0c;你学习了吗&#xff1f; 一、RS485简介 物联网&#xff08;IoT&#xff09;在工业场景中的应用越来越广泛&#xff0c;而RS485是一种常见的通信协议&#xff0c;广泛应用于工业自动…

快手:数据库升级实践,实现PB级数据的高效管理|OceanBase案例

本文作者&#xff1a;胡玉龙&#xff0c;快手技术专家 快手在较初期采用了OceanBase 3.1版本成功替换了多个核心业务、数百套的MySQL集群。至2023年&#xff0c;快手的数据量已突破800TB大关&#xff0c;其中最大集群的数据量更是达到了数百TB级别。为此&#xff0c;快手将数据…

关于视频监控介入的部分内容,使用的是海康H5web播放的模式

这是原发直接能在系统中使用。里面的样式自己修改&#xff0c;主要是在引入时出现黑色的框就是引入成功&#xff0c;需要在public文件夹中引入h5player.min.js文件就可以。 <template><div class"Shiping"><el-container><el-header><di…

【数据分享】2001-2023年我国省市县镇四级的逐月平均气温数据(免费获取/Shp/Excel格式)

之前我们分享过1901-2023年1km分辨率逐月平均气温栅格数据&#xff0c;该数据来源于国家青藏高原科学数据中心。为方便大家使用&#xff0c;我们还基于上述平均气温栅格数据将数据处理为Shp和Excel格式的省市县三级逐月平均气温数据&#xff08;可查看之前的文章获悉详情&#…

ubuntu 18.04 cuda 11.01 gpgpu-sim 裸机编译

1&#xff0c;环境 ubuntu 18.04 x86_64 cuda 11.01 gpgpu-sim master commit 90ec3399763d7c8512cfe7dc193473086c38ca38 2&#xff0c;预备环境 一个比较新的 ubuntu 18.04&#xff0c;为了迎合 cuda 11.01 的版本需求 安装如下软件&#xff1a; sudo apt-get instal…

【Linux】几种常见配置文件介绍

配置文件目录 linux 系统中有很多配置文件目录 /etc/systemd/system /lib/systemd/system /usr/lib/systemd/system 【结果就是这个目录配置文件是源头】 这三者有什么样的关系呢&#xff1f; 以下是网络上找的资料汇总&#xff0c;并加了一些操作验证。方便后期使用 介…

VMware中Ubuntu系统Docker正常运行但网络不通(已解决)

问题描述&#xff1a;在VMware中的Ubuntu系统下部署了Docker&#xff0c;当在docker容器中运行Eureka微服务时&#xff0c;发现Eureka启动正常&#xff0c;但无法通过网页访问该容器中Eureka。 解决办法如下&#xff1a; 1、创建桥接网络&#xff1a;test-net sudo docker n…

ARM 架构、cpu

一、ARM的架构 ARM是一种基于精简指令集&#xff08;RISC&#xff09;的处理器架构. 1、ARM芯片特点 ARM芯片的主要特点有以下几点&#xff1a; 精简指令集&#xff1a;ARM芯片使用精简指令集&#xff0c;即每条指令只完成一项简单的操作&#xff0c;从而提高指令的执行效率…

进程的创建、多任务及退出

一、创建进程 1、并发与并行 为了提高计算机执行任务的效率&#xff0c;一般采用的解决方案就是能够让多个任务同时进行&#xff0c;可以使用 并发 与 并行两种方式 并行 : 在 cpu 多核的支持下&#xff0c;实现物理上的同时执行 并发 : 在有限的 cpu 核芯的情况下 , …

60 序列到序列学习(seq2seq)_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录一、理论知识比喻机器翻译Seq2seq编码器-解码器细节训练衡量生成序列的好坏的BLEU(值越大越好)总结 二、代码编码器解码器损失函数训练预测预测序列的评估小结练习 一、理论知识 比喻 seq2seq就像RNN的转录工作一样&#xff0c;非常形象的比…

Percona Monitoring and Management

Percona Monitoring and Management (PMM)是一款开源的专用于管理和监控MySQL、MongoDB、PostgreSQL

netty之NettyClient半包粘包处理、编码解码处理、收发数据方式

前言 Netty开发中&#xff0c;客户端与服务端需要保持同样的&#xff1b;半包粘包处理&#xff0c;编码解码处理、收发数据方式&#xff0c;这样才能保证数据通信正常。在前面NettyServer的章节中我们也同样处理了&#xff1b;半包粘包、编码解码等&#xff0c;为此在本章节我们…

C++和OpenGL实现3D游戏编程【连载12】——游戏中音效的使用

1、游戏中音效的使用 前面我们实现了图片纹理的显示功能,是不是感觉到非常的简单。那么今天我们就继续说下游戏声音的实现。音效也是游戏的灵魂,只有搭配了美妙动听的音效以后,游戏才能令人耳目一新,与玩家产生良好的效果。 音效文件最常用的可分为两种,分别为.wav和.mp3…

SQL Server中关于个性化需求批量删除表的做法

在实际开发中&#xff0c;我们常常会遇到需要批量删除表&#xff0c;且具有共同特征的情况&#xff0c;例如&#xff1a;找出表名中数字结尾的表之类的&#xff0c;本文我将以3中类似情况为例&#xff0c;来示范并解说此类需求如何完成&#xff1a; 第一种&#xff0c;批量删除…

Mysql 学习——项目实战

MySQL 学习——项目实战 项目出处 博主&#xff1a;Asmywishi Linux-Ubuntu启动Mysql sudo mysqlData preparation Create Database and Table Create database : create database mysql_example1;Start database : use mysql_example1;Create Student table : # 学生表…