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

QT打开外部程序并嵌入Qt子窗口的缺点

首先可以参考如下文章:

QT打开外部程序并嵌入Qt界面_qt界面嵌入外部应用程序_初学小白Lu的博客-CSDN博客

 Qt嵌入外部程序界面初探_qt嵌入其他程序窗口_liming4675的博客-CSDN博客

 QT 如何把外部程序嵌入到QT界面_qt嵌入其他程序窗口_hellokandy的博客-CSDN博客

 Qt界面程序中嵌入其他可执行exe程序_qt 把exe嵌入窗口_new_2018的博客-CSDN博客

 Qt 嵌入第三方程序_qt 内嵌第三方程序_缘如风的博客-CSDN博客

QT中使用嵌入窗口_qt 嵌入窗口_blwinner的博客-CSDN博客

 qt中父进程窗口嵌入子进程产生的窗口_tusong86的博客-CSDN博客

缺点就是:

  1. 依赖windows的原生api,因此别的平台,可能就无法实现了,例如mac上好像就不行了
  2. 需要先通过QProcess等方式打开该软件,然后进行嵌入,会导致被嵌软件闪烁一下,然后嵌进去,影响使用感。这个问题是无法解决的,就算QProcess启动后,立刻进行嵌入,也会闪现一下软件的
  3. 再拉伸外面软件时,被嵌软件出现锯齿状残留等现象,明显是有问题的
  4. 可能鼠标,或者键盘啥的,响应有奇奇怪怪的问题

总之,这样做,是不好用的,所以要么就是以分离软件的形式启动,让它独立运行,或者直接嵌入源码一起编译了(在两个软件都是自己开发的情况了,因为需要源码)。

mainwindow.h 文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>namespace Ui {
class MainWindow;
}class QProcess;class WidgetScheulerAnalysis : public QMainWindow
{Q_OBJECTpublic:explicit WidgetScheulerAnalysis(QWidget *parent = 0);~WidgetScheulerAnalysis();private slots:void on_pushButton_clicked();void on_processStarted();
private:Ui::MainWindow *ui;QProcess* m_process;QWindow* m_window;QWidget* m_widget;
};#endif // MAINWINDOW_H

mainwindow.cpp 文件

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <Windows.h>#include <QProcess>
#include <QWindow>
#include <QDebug>
#include <QDir>
#include <QMessageBox>//自定义结构体
struct handle_data {unsigned long process_id;HWND best_handle;
};BOOL IsMainWindow(HWND handle);
BOOL CALLBACK EnumWindowsCallback(HWND handle, LPARAM lParam);
HWND FindMainWindow(unsigned long process_id);//通过进程id号获取主窗口句柄BOOL IsMainWindow(HWND handle)
{return GetWindow(handle, GW_OWNER) == (HWND)0 && IsWindowVisible(handle);
}BOOL CALLBACK EnumWindowsCallback(HWND handle, LPARAM lParam)
{handle_data& data = *(handle_data*)lParam;unsigned long process_id = 0;GetWindowThreadProcessId(handle, &process_id);if (data.process_id != process_id || !IsMainWindow(handle)) {return TRUE;}data.best_handle = handle;return FALSE;
}//通过进程id号获取主窗口句柄
HWND FindMainWindow(unsigned long process_id)
{handle_data data;data.process_id = process_id;data.best_handle = 0;EnumWindows(EnumWindowsCallback, (LPARAM)&data);return data.best_handle;
}WidgetScheulerAnalysis::WidgetScheulerAnalysis(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);}WidgetScheulerAnalysis::~WidgetScheulerAnalysis()
{delete ui;
}void WidgetScheulerAnalysis::on_pushButton_clicked()
{
#if 0
//    QProcess *pro = new QProcess(this);
//    pro->start("TaskSchedSimulatPlatform/TaskSchedSimulatPlatform.exe");//    QString Name = "TaskSchedSimulatPlatform";//启动QDir::setCurrent("C:\\windows\\system32");QProcess *pro = new QProcess(this);pro->start("notepad.exe");
//    pro->waitForStarted();//    Sleep(10);QString Name = "无标题 - 记事本";
//    WId hwnd = (WId)FindWindow(L"MainWindow",(LPCTSTR)Name.unicode());WId hwnd ;while(1){hwnd = (WId)FindWindow(L"Notepad",(LPCTSTR)Name.unicode());if(hwnd != 0)break;}qDebug()<<hwnd;//嵌入if (hwnd > 0){QWindow *m_window;m_window = QWindow::fromWinId(WId(hwnd));QWidget *m_widget;m_widget = QWidget::createWindowContainer(m_window,this);ui->verticalLayout->addWidget(m_widget);}#endif/**启动外部程序*///QString cmd = "D:/Program Files/InnovMetric/PolyWorks MS 2021/bin/polyworks.exe";//QString cmd = "D:/Program Files (x86)/Adobe/Reader 11.0/Reader/AcroRd32.exe";//QString cmd = "D:/Program Files/MVS/MVS/Applications/Win64/MVS.exe";QString exePath = "TaskSchedSimulatPlatform/TaskSchedSimulatPlatform.exe";m_process = new QProcess(this);connect(m_process, &QProcess::started, this, &WidgetScheulerAnalysis::on_processStarted);m_process->setParent(this);	QStringList arg;arg << "";m_process->start(exePath, arg);//外部程序启动后,将随主程序的退出而退出 //m_process->start(exePath);//外部程序启动后,将随主程序的退出而退出  }//嵌入外部程序
void WidgetScheulerAnalysis::on_processStarted()
{   qint64 id = m_process->processId();//如果程序没有运行,将会返回0
//    while (1) {
//        if(m_process->state() == QProcess::Running  && id !=0)
//            break;
//    }
//	if (id == 0)
//	{
//		QMessageBox::information(NULL, "提示", "程序没有启动");
//		return;
//	}//	Sleep(100);qDebug() << "Status: " << m_process->state();
//	HWND mainwindowHwnd = FindMainWindow(id);HWND mainwindowHwnd;while (1) {mainwindowHwnd = FindMainWindow(id);if(mainwindowHwnd)break;}//	qDebug() << "mainwindowHwnd: " << mainwindowHwnd;
//	if (!mainwindowHwnd)
//		return;//    while (1) {
//        if(mainwindowHwnd != 0)
//            break;
//    }QWindow *m_window;m_window = QWindow::fromWinId(WId(mainwindowHwnd));m_window->setFlags(m_window->flags() | Qt::CustomizeWindowHint | Qt::WindowTitleHint); //这边可以设置一下属性QWidget *m_widget;m_widget = QWidget::createWindowContainer(m_window,this);ui->verticalLayout->addWidget(m_widget);}

相关文章:

QT打开外部程序并嵌入Qt子窗口的缺点

首先可以参考如下文章&#xff1a; QT打开外部程序并嵌入Qt界面_qt界面嵌入外部应用程序_初学小白Lu的博客-CSDN博客 Qt嵌入外部程序界面初探_qt嵌入其他程序窗口_liming4675的博客-CSDN博客 QT 如何把外部程序嵌入到QT界面_qt嵌入其他程序窗口_hellokandy的博客-CSDN博客 Qt界…...

如何系统地学习 C++ 语言?

C作为具有广泛适用性的编程语言&#xff0c;学习C的人越来越多&#xff0c;但是如何系统地学习C还是个问题&#xff0c;下面我们一起来看一下C学习的方法有哪些吧。 首先&#xff0c;要学习C&#xff0c;最重要的就是掌握C的基础知识。 比如数据结构、算法、微积分等。这些都是…...

【数据结构】单链表

链表1.为什么存在链表2.链表的概念3.单链表的实现4.测试1.为什么存在链表 我们在学习顺序表的时候&#xff0c;了解到顺序表有一定的缺陷&#xff1a;&#xff08;1&#xff09;在中间插入数据和删除数据需要挪动数据&#xff0c;时间复杂度是O&#xff08;N&#xff09;&…...

Windows 右键菜单扩展容器 [开源]

今天给大家分享一个我做的小工具&#xff0c;可以自定义扩展右键菜单的功能来提高工作效率&#xff0c;效果图如下&#xff1a; 如上图&#xff0c;右键菜单多了几个我自定义的菜单&#xff1a; 复制文件路径 复制文件夹路径 我的工具箱 <走配置文件动态创建子菜单&#x…...

爆文制造机!小红书热榜3个方向,告诉你选题诀窍!

我们知道&#xff0c;不论是达人创作内容&#xff0c;还是品牌制定Brief&#xff0c;都需要提前调研筛选海量信息&#xff0c;这时候如果有一个自己的内容素材库&#xff0c;就省事多啦。按照内容需求&#xff0c;我们可以按3个角度划分小红书内容素材&#xff1a;笔记类型、竞…...

【Web安全社工篇】——水坑攻击

作者名&#xff1a;白昼安全主页面链接&#xff1a; 主页传送门创作初心&#xff1a; 以后赚大钱座右铭&#xff1a; 不要让时代的悲哀成为你的悲哀专研方向&#xff1a; web安全&#xff0c;后渗透技术每日鸡汤&#xff1a;努力赚钱不是因为爱钱“水坑攻击”&#xff0c;黑客攻…...

SpringBoot 整合 MongoDB 实现数据的增删改查!

一、介绍在 MongoDB 中有三个比较重要的名词&#xff1a;数据库、集合、文档&#xff01;数据库&#xff08;Database&#xff09;&#xff1a;和关系型数据库一样&#xff0c;每个数据库中有自己的用户权限&#xff0c;不同的项目组可以使用不同的数据库集合&#xff08;Colle…...

VUE前端常问面试题

文章目录一、VUE前端常问面试题二、文档下载地址一、VUE前端常问面试题 1、MVC和MVVM 区别 MVC&#xff1a;MVC全名是 Model View Controller&#xff0c;即模型-视图-控制器的缩写&#xff0c;一种软件设计典范。 Model(模型)&#xff1a;是用于处理应用程序数据逻辑部分。通…...

c++中map/unordered_map的不同遍历方式以及结构化绑定

文章目录方式一&#xff1a;值传递遍历方式二&#xff1a;引用传递遍历方式三&#xff1a;使用迭代器遍历方式四&#xff1a;结构化绑定(c17特性)结构化绑定示例&#xff08;1&#xff09;元组tuple结构化绑定&#xff08;2&#xff09;结构体结构化绑定&#xff08;3&#xff…...

Kafka系列之:Kraft模式

Kafka系列之:Kraft模式 一、Kraft架构二、Kafka的Kraft集群部署三、初始化集群数据目录四、创建KafkaTopic五、查看Kafka Topic六、创建生产者七、创建消费者一、Kraft架构 Kafka元数据存储在zookeeper中,运行时动态选举controller,由controller进行Kafka集群管理。Kraft模式…...

动态规划:leetcode 139.单词拆分、多重背包问题

leetcode 139.单词拆分leetcode 139.单词拆分给定一个非空字符串 s 和一个包含非空单词的列表 wordDict&#xff0c;判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明&#xff1a;拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例 1&…...

Stable Diffusion原理详解

Stable Diffusion原理详解 最近AI图像生成异常火爆&#xff0c;听说鹅厂都开始用AI图像生成做前期设定了&#xff0c;小厂更是直接用AI替代了原画师的岗位。这一张张丰富细腻、风格各异、以假乱真的AI生成图像&#xff0c;背后离不开Stable Diffusion算法。 Stable Diffusion…...

webpack高级配置

摇树&#xff08;tree shaking&#xff09; 我主要是想说摇树失败的原因&#xff08;tree shaking 失败的原因&#xff09;&#xff0c;先讲下摇树本身效果 什么是摇树&#xff1f; 举个例子 首先 webpack.config.js配置 const webpack require("webpack");/**…...

jQuery 事件

jQuery 事件 Date: February 28, 2023 Sum: jQuery事件注册、处理、对象 目标&#xff1a; 能够说出4种常见的注册事件 能够说出 on 绑定事件的优势 能够说出 jQuery 事件委派的优点以及方式 能够说出绑定事件与解绑事件 jQuery 事件注册 单个时间注册 语法&#xff1a;…...

【批处理脚本】-2.3-解析地址命令arp

"><--点击返回「批处理BAT从入门到精通」总目录--> 共2页精讲(列举了所有arp的用法,图文并茂,通俗易懂) 目录 1 arp命令解析 1.1 询问当前协议数据,显示当前 ARP 项...

改进 YOLO V5 的密集行人检测算法研究(论文研读)——目标检测

改进 YOLO V5 的密集行人检测算法研究&#xff08;2021.08&#xff09;摘 要&#xff1a;1 YOLO V52 SENet 通道注意力机制3 改进的 YOLO V5 模型3.1 训练数据处理改进3.2 YOLO V5 网络改进3.3 损失函数改进3.3.1 使用 CIoU3.3.2 非极大值抑制改进4 研究方案与结果分析4.1 实验…...

Python - Opencv应用实例之CT图像检测边缘和内部缺陷

Python - Opencv应用实例之CT图像检测边缘和内部缺陷 将传统图像处理处理算法应用于CT图像的边缘检测和缺陷检测,想要实现效果如下: 关于图像处理算法,主要涉及的有:灰度、阈值化、边缘或角点等特征提取、灰度相似度变换,主要偏向于一些2D的几何变换、涉及图像矩阵的一些统…...

管理逻辑备数据库(Logical Standby Database)

1. SQL Apply架构概述 SQL Apply使用一组后台进程来应用来自主数据库的更改到逻辑备数据库。 在日志挖掘和应用处理中涉及到的不同的进程和它们的功能如下&#xff1a; 在日志挖掘过程中&#xff1a; 1&#xff09;READER进程从归档redo日志文件或备redo日志文件中读取redo记…...

【C++】构造函数(初始化列表)、explicit、 Static成员、友元、内部类、匿名对象

构造函数&#xff08;初始化列表&#xff09;前提构造函数体赋值初始化列表explicit关键字static成员概念特性&#xff08;重要&#xff09;有元友元函数友元类内部类匿名对象构造函数&#xff08;初始化列表&#xff09; 前提 前面 六个默认成员对象中我们已经学过什么是构造…...

(六十)再来看看几个最常见和最基本的索引使用规则

今天我们来讲一下最常见和最基本的几个索引使用规则&#xff0c;也就是说&#xff0c;当我们建立好一个联合索引之后&#xff0c;我们的SQL语句要怎么写&#xff0c;才能让他的查询使用到我们建立好的索引呢&#xff1f; 下面就一起来看看&#xff0c;还是用之前的例子来说明。…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...