当前位置: 首页 > 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
http://www.lryc.cn/news/181188.html

相关文章:

  • 【chainlit】使用chainlit部署chatgpt
  • 测开 | Vue速查知识点
  • 数据结构——二叉树的基本概念及顺序存储(堆)
  • acwing算法基础之基础算法--整数二分算法
  • windows C 开发
  • C语言——动态内存管理详解(内存结构、动态内存函数、易错题、柔性数组)
  • 2023年全国控制科学与工程学科评估结果 - 自动化考研
  • React wangEditor5 使用说明
  • vue 实现数字验证码功能
  • 【计算机网络】HTTP协议详解(举例解释,超级详细)
  • PCB放置过孔技巧
  • 淘宝商品详情接口数据采集用于上货,无货源选品上货,采集淘宝天猫商品详情数据
  • DoS和DDos攻攻击
  • Python实时采集Windows CPU\MEMORY\HDD使用率
  • 【改造中序遍历算法】1038. 从二叉搜索树到更大和树
  • 克服网络安全压力:如何掌控无限的云数据
  • 【数据结构和算法】--N叉树中,返回某些目标节点到根节点的所有路径
  • 进程和线程的区别 线程之间共享的资源
  • 基于Matlab实现logistic方法(源码+数据)
  • leetCode 121. 买卖股票的最佳时机 贪心算法
  • 《Oracle系列》Oracle 索引使用情况查看
  • 解决Invalid bound statement (not found)错误~
  • 基于SpringBoot的反诈宣传平台设计与实现(源码+lw+部署文档+讲解等)
  • 【改进哈里鹰算法(NCHHO)】使用混沌和非线性控制参数来提高哈里鹰算法的优化性能,解决车联网相关的路由问题(Matlab代码实现)
  • 【C语言】宏定义
  • 库存三层模型概述
  • SNERT预备队招新CTF体验赛-Web(SWCTF)
  • OpenGLES:绘制一个彩色、旋转的3D圆柱
  • 【QT开发(6)】0926-QT 中加入 fastDDS 通信库的程序使用说明
  • js 判断字符串中是否包含某个字符串