qt 窗体嵌入到任务栏

qwidget嵌入到任务栏

#include <QApplication>
#include <QWidget>
#include <QDebug>
#include <windows.h>
#include <QVBoxLayout> // 包含 QVBoxLayout 头文件
#include <QLabel>
#include <QLineEdit>int main(int argc, char *argv[]) {QApplication a(argc, argv);// 获取任务栏的高度HWND taskbar = FindWindow(L"Shell_traywnd", NULL);RECT taskbarRect;GetWindowRect(taskbar, &taskbarRect);int taskbarHeight = taskbarRect.bottom - taskbarRect.top;// 创建一个简单的 QWidget 对象QWidget widget;widget.setWindowTitle("Embedded Widget");int widgetHeight = taskbarHeight;int widgetWidth = taskbarHeight * 8;widget.resize(widgetWidth, widgetHeight);// 创建一个垂直布局管理器QVBoxLayout *layout = new QVBoxLayout(&widget);layout->setContentsMargins(0, 0, 0, 0); // 设置布局边距为0// 创建一个 QLabel 控件用于显示红色文字QLabel *label = new QLabel;label->setText("<font color='red'>Red Text</font>");label->setAlignment(Qt::AlignCenter);// 将 QLabel 添加到垂直布局中layout->addWidget(label);// 设置 QWidget 的布局widget.setLayout(layout);// 隐藏标题栏并设置为不可移动widget.setWindowFlag(Qt::FramelessWindowHint);widget.setWindowFlag(Qt::WindowStaysOnTopHint);widget.show();// 寻找任务栏的句柄HWND hShell = FindWindowEx(NULL, NULL, L"Shell_TrayWnd", NULL);if (hShell == NULL) {qDebug() << "Failed to find taskbar.";return 1;}// 寻找ReBarWindow32的句柄HWND hReBar = FindWindowEx(hShell, NULL, L"ReBarWindow32", NULL);if (hReBar == NULL) {qDebug() << "Failed to find ReBarWindow32.";return 1;}// 将窗口嵌入到ReBarWindow32容器中SetParent((HWND)widget.winId(), hReBar);// 将窗口移动到指定位置RECT rcReBar;GetWindowRect(hReBar, &rcReBar);int windowX = rcReBar.right - widgetWidth; // 将窗口放置在ReBarWindow32的最右侧int windowY = (rcReBar.bottom - rcReBar.top - widgetHeight) / 2; // 竖直居中if (!MoveWindow((HWND)widget.winId(), windowX, windowY, widgetWidth, widgetHeight, TRUE)) {qDebug() << "Failed to move embedded widget.";return 1;}return a.exec();
}

qml嵌入到任务栏,原理是qml文件嵌入到QQuickWidget 中,然后用它实现上一步的qwidget嵌入,注意qml的内容,不能是window等,只能是item,Rectangle等。

QQuickWidget *qmlWidget = new QQuickWidget(QUrl("qrc:/main.qml"));qmlWidget->setWindowFlags(Qt::FramelessWindowHint);qmlWidget->show();// 获取屏幕的尺寸QScreen *screen = QApplication::primaryScreen();QRect screenGeometry = screen->geometry();// 获取任务栏的高度HWND taskbar = FindWindow(L"Shell_traywnd", NULL);RECT taskbarRect;GetWindowRect(taskbar, &taskbarRect);int taskbarHeight = taskbarRect.bottom - taskbarRect.top;int widgetHeight = taskbarHeight;int widgetWidth = taskbarHeight * 2;// 寻找任务栏的句柄HWND hShell = FindWindowEx(NULL, NULL, L"Shell_TrayWnd", NULL);if (hShell == NULL) {qDebug() << "Failed to find taskbar.";return 1;}// 寻找ReBarWindow32的句柄HWND hReBar = FindWindowEx(hShell, NULL, L"ReBarWindow32", NULL);if (hReBar == NULL) {qDebug() << "Failed to find ReBarWindow32.";return 1;}// 将窗口嵌入到ReBarWindow32容器中SetParent((HWND)qmlWidget->winId(), hReBar);// 将窗口移动到指定位置RECT rcReBar;GetWindowRect(hReBar, &rcReBar);int windowX = rcReBar.right - widgetWidth * 2; // 将窗口放置在ReBarWindow32的最右侧int windowY = (rcReBar.bottom - rcReBar.top - widgetHeight) / 2; // 竖直居中if (!MoveWindow((HWND)qmlWidget->winId(), windowX, windowY, widgetWidth, widgetHeight, TRUE)) {qDebug() << "Failed to move embedded widget.";return 1;}

qml文件

import QtQuick 2.0Rectangle {id: rootwidth: 400height: 400color: "lightblue"MouseArea {id: dragAreaanchors.fill: parentcursorShape: Qt.OpenHandCursorproperty var dragStartPosition: Qt.point()onPressed: {dragStartPosition = Qt.point(mouse.x, mouse.y)}onPositionChanged: {if (dragArea.drag.active) {qmlWidget.x += mouse.x - dragStartPosition.xqmlWidget.y += mouse.y - dragStartPosition.ydragStartPosition = Qt.point(mouse.x, mouse.y)}}}Text {text: "Hello, World!"anchors.centerIn: parentfont.pointSize: 24color: "black"}
}

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

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

相关文章

[AutoSar]BSW_Diagnostic_003 ReadDataByIdentifier(0x22)介绍

目录 关键词平台说明背景一、请求格式二、常用DID三、响应格式四、NRC五、case 关键词 嵌入式、C语言、autosar、OS、BSW、UDS、diagnostic 平台说明 项目ValueOSautosar OSautosar厂商vector &#xff0c; EB芯片厂商TI 英飞凌编程语言C&#xff0c;C编译器HighTec (GCC)au…

Linux环境下parted工具使用

在工作中&#xff0c;我们经常会遇到大于分区大于2T的磁盘&#xff0c;由于系统盘最大不能超2T&#xff0c;我们会在做raid时将划分VD来进行装系统&#xff0c;但系统自动安装后无法将磁盘全部识别出来&#xff0c;管理员有时会要求手动对分区进行挂载&#xff0c;这个文档介绍…

保研机试之【二叉树后序】--1道题

参考&#xff1a;东哥带你刷二叉树&#xff08;后序篇&#xff09; | labuladong 的算法笔记 建议先过一遍&#xff1a;今天是二叉树~-CSDN博客&#xff0c;very重要&#xff01; 然后再过一遍&#xff08;理解怎么应用方法&#xff09;&#xff1a;保研机试之[三道二叉树习题…

用python写算法——队列笔记

1.队列定义 队列是一种特殊的线性表&#xff0c;它只允许在表的前端进行删除操作&#xff0c;在表的后端进行插入操作&#xff0c;和栈一样&#xff0c;队列是一种操作受限制的线性表。进行插入操作的端称为队尾&#xff0c;进行删除操作的端称为队头。队列中没有元素时&#…

【初级数据结构】队列

目录 前言队列的概念及结构队列的实现队列的结构队列的初始化队列的销毁入队出队取队头元素取队尾元素判断队列是否为空取出队列中元素个数代码测试 完整代码Queue.hQueue.ctest.c 前言 前面我们已经学习了栈&#xff0c;栈是一种后进先出的结构&#xff0c;即LIFO&#xff0c;…

前端工程化,前端监控,工作流,部署,性能

开发规范 创建项目的时候&#xff0c;配置下 ESlint&#xff0c;stylelint&#xff0c; prettier&#xff0c; commitlint 等; ESLint 主要功能&#xff1a; ESLint 是一个静态代码检查工具&#xff0c;用于在 JavaScript 代码中识别和报告模式。它的目标是提供一个插件化的 …

ImageMagick 的基本概念和使用场景

ImageMagick 是一个开源的、跨平台的图像处理软件套件&#xff0c;可以用于创建、编辑、合成、转换图像等各种图像处理操作。它支持超过200多种图像格式&#xff0c;包括常见的JPEG、PNG、GIF&#xff0c;以及一些不常见的格式。ImageMagick 提供了丰富的命令行工具和编程接口&…

electron进程间通信

Electron 应用程序的结构非常相似。 作为应用开发者&#xff0c;你将控制两种类型的进程&#xff1a;主进程 和 渲染器进程。 这类似于上文所述的 Chrome 的浏览器和渲染器进程。 主进程 每个 Electron 应用都有一个单一的主进程&#xff0c;作为应用程序的入口点。 主进程在 N…

红黑树的理解和简单实现

目录 1. 红黑树的概念和性质 2. 红黑树的插入 2.1. 情况一&#xff1a;新增节点的父亲为空 2.2. 情况二&#xff1a;新增节点的父亲非空且为黑色节点 2.3. 情况三&#xff1a;当父亲为红节点&#xff0c;叔叔存在且为红 2.3.1. 当祖父为根节点的时候 2.3.2. 当祖父不是根…

AttributeError: module ‘PIL.Image‘ has no attribute ‘ANTIALIAS‘

问题描述 修改图片大小的时候&#xff0c;代码报错&#xff1a;AttributeError: module PIL.Image has no attribute ANTIALIAS 解决方案 在pillow的10.0.0版本中&#xff0c;ANTIALIAS方法被删除了。 方法1&#xff1a;修改版本&#xff08;不推荐&#xff09; pip instal…

docker 方式 elasticsearch 8.13 简单例子

安装 docker 虚拟机安装 elastic search 安装本地 # 创建 elastic 的网络 docker network create elastic # 用镜像的方式创建并启动容器 docker run -d --name es --net elastic -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" -e "xpack.secur…

嵌入式全栈开发学习笔记---C语言笔试复习大全16

目录 指针和数组 用指针来表示数组 用数组来表示指针 笔试题19 上一篇复习了指针使用时的相关注意事项&#xff0c;这一篇我们开始复习指针和数组。 说明&#xff1a;我们学过单片机的一般都是有C语言基础的了&#xff0c;网上关于C语言的资料有很多&#xff0c;大家如果对…

【半夜学习MySQL】数据库中的数据类型(含数值类型、文本二进制类型、时间类型、String类型详谈)

&#x1f3e0;关于专栏&#xff1a;半夜学习MySQL专栏用于记录MySQL数据相关内容。 &#x1f3af;每天努力一点点&#xff0c;技术变化看得见 文章目录 数据类型分类数值类型bit类型tinyint类型int类型float类型decimal类型 文本、二进制类型char类型varchar类型 时间类型Strin…

大模型日报2024-05-12

大模型日报 2024-05-12 大模型资讯 阿里巴巴新AI模型宣称超越OpenAI的GPT-4语言能力 摘要: 周四&#xff0c;阿里巴巴集团旗下的阿里云宣布推出其最新版大型语言模型。该模型声称在语言技能方面超越了OpenAI的GPT-4。阿里巴巴集团有限公司&#xff08;纽交所代码&#xff1a;BA…

1.1. 离散时间鞅-条件期望

1.1. 离散时间鞅-条件期望 条件期望1. 条件期望的定义1.1. 条件期望的定义1.2. 条件期望的存在唯一性 2. 条件期望的示例2.1. X ∈ F X \in \mathcal{F} X∈F&#xff0c; X X X与 F \mathcal{F} F独立的情形2.2. X X X是有限 σ \sigma σ代数情形2.3. X X X是随机变量生成…

无障碍网络(Accessibility)

无障碍网络&#xff0c;有时也被称为Web无障碍&#xff0c;是确保所有人&#xff0c;包括那些有视觉、听力、肢体等障碍的人&#xff0c;都能够顺利、有效地使用网站和在线服务的一种指导原则和一种做法。无障碍网络的重要性无法过分强调。网络应该是公开、开放和无障碍的&…

[Flutter GetX使用] Getx路由和状态管理-GetController使用过程中的踩坑记录

文章目录 问题 - Get.find() 报错!原因总结A:路由和控制器设计a1:项目中的Get路由aa1.项目路由结构aa2.本项目路由的注意点: B: GetController的冷知识C: 总结来看D: 一些参考资料 问题 - Get.find() 报错! 刚接触Getx, 遇到 Get.find()确找不到, 进而报错的问题, 一时间有点没…

智慧旅游平台开发微信小程序【附源码、文档说明】

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

Java 中 String 类的 split() 方法

split() 方法 是 Java 中 String 类的一个常用方法&#xff0c;用于将字符串按照指定的分隔符分割成一个字符串数组。 它是一个非常强大的工具&#xff0c;可以用于各种字符串处理任务&#xff0c;例如&#xff1a; 从字符串中提取单词将字符串解析成不同的部分将字符串转换为…

关于DDD和COLA的一些总结和思考

1|0思维&#xff1a;面向对象和面向过程 领域驱动设计本质上是讲的面向对象&#xff0c;但是谈面向对象&#xff0c;始终无法绕开面向过程&#xff0c;所以我们先好好说一下面向过程和面向对象这两个概念。 什么是面向过程呢&#xff0c;其实就是我们学习编程时最初被植入的逻辑…