Qt在已存在的控件上绘图

在Qt中,如果你不想重新实现一个控件的绘图逻辑,而是在已存在的标准控件或第三方控件上绘图,通常的做法是利用Qt的布局系统、叠加窗口(QStackedWidgetQDialog等)或者使用事件过滤器来间接达到目的。以下是常见方法:

使用布局系统覆盖

如果你的目标是在某个控件上方绘制内容,但不修改该控件本身,可以考虑使用布局系统将一个透明的自绘控件放置在这个控件之上。

  1. 创建透明绘图控件:创建一个新的QWidget子类,重写其paintEvent方法来实现绘图,并设置背景为透明。

    class TransparentOverlay : public QWidget {
        Q_OBJECT
    public:
        explicit TransparentOverlay(QWidget *parent = nullptr) : QWidget(parent) {
            setAttribute(Qt::WA_TransparentForMouseEvents); // 使鼠标事件穿透
            setAttribute(Qt::WA_TranslucentBackground); // 设置背景透明
        }
        void paintEvent(QPaintEvent *event) override {
            // 在这里实现你的绘图逻辑
            QPainter painter(this);
            // 绘图代码...
        }
    };
    
  2. 布局中添加透明控件:在你的界面布局中,将这个透明绘图控件放置在目标控件之上,确保它们处于同一父控件之下,并且透明控件位于顶层。

利用QStackedWidget或QGraphicsScene

  • QStackedWidget:尽管不是直接在控件上绘图,但可以通过在QStackedWidget中添加一个透明的页面来模拟覆盖效果。
  • QGraphicsScene:如果你的界面设计允许,可以使用QGraphicsViewQGraphicsScene,在场景中添加图形项,这样就可以灵活地在其他控件上方绘制图形。

事件过滤器(Event Filters)

事件过滤器可以让你拦截并处理传递给控件的事件,虽然不直接用于绘图,但你可以通过这种方式监听特定事件(如鼠标移动),然后在其他地方(比如一个覆盖层)进行相应的绘图反应。

  1. 安装事件过滤器:在目标控件上安装一个事件过滤器,然后在过滤器函数中处理绘图逻辑。

    bool MyFilterObject::eventFilter(QObject *watched, QEvent *event) {
        if (event->type() == QEvent::MouseMove && watched == myTargetWidget) {
            // 在这里可以根据鼠标位置更新绘图
            updateOverlay();
            return false; // 通常情况下,返回false让事件继续传递
        }
        return QObject::eventFilter(watched, event);
    }
    

    :上述代码中,如果将判断event->type()等于的是QEvent::Paint类型,则可以重新绘制整个watched对象。

  2. 更新绘图:在上述的updateOverlay方法中,更新你的透明绘图层或者在适当的地方进行绘图。

注意

  • 直接在非自绘控件上绘图通常不是Qt推荐的做法,因为这可能违反控件的预期行为和设计原则。
  • 使用透明覆盖层时,要确保正确处理事件传递,避免干扰底层控件的功能。
  • 事件过滤器主要用于监听和修改事件处理流程,而不是直接绘图,但它可以作为触发绘图操作的机制。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

APP测试面试题汇总

🍅 视频学习:文末有免费的配套视频可观看 🍅 关注公众号【互联网杂货铺】,回复 1 ,免费获取软件测试全套资料,资料在手,涨薪更快 一、基础篇 1、请介绍一下,APP测试流程&#xff1f…

嵌入式学习59-ARM7(自动设备号和混杂设备)

知识零碎: 头文件查找: /arm/路径下的头文件 linux驱动程序的编写,编译,运行过程 -------------------------------------------------------------------------------------------------------------------------------- 1.…

30秒出服装设计稿,森马用Serverless+AIGC 整“新活”!

“创新项目如何去赋能我们的业务,这件事情在森马很重要。阿里云函数计算帮我们屏蔽掉了想把AI落地到实际业务场景中 GPU 算力资源储备、采购成本、技术门槛等很多难题,从而迅速做出决策,快人一步站在正确的起点,体验新技术对整个服…

用友裁应届

下半年准备来用友的24应届生们,请三思!!! 我是23届某9研究生,2月份用友以绩效低为由被裁(我一个应届生跟老员工比绩效,搞笑呢)。 半年被裁,找工作太难了&a…

LangChain之各个输出解析器的使用

Model I/O 在LangChain中,Model I/O被称为:模型的输入与输出,其有输入提示(Format)、调用模型(Predict)、输出解析(Parse)等三部分组成。 makefile 复制代码 1.提示模板: LangChain的模板允许动态选择输入,根据实际需求调整输入内…

【mysql】mysql中的数据类型知多少?

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

WiTUnet:一种集成CNN和Transformer的u型架构,用于改进特征对齐和局部信息融合

WiTUnet:一种集成CNN和Transformer的u型架构,用于改进特征对齐和局部信息融合 摘要IntroductionRelated workMethod WiTUnet: A U-Shaped Architecture Integrating CNN and Transformer for Improved Feature Alignment and Local Information Fusion. 摘要 低剂量…

Python | Leetcode Python题解之第52题N皇后II

题目: 题解: class Solution:def totalNQueens(self, n: int) -> int:def backtrack(row: int) -> int:if row n:return 1else:count 0for i in range(n):if i in columns or row - i in diagonal1 or row i in diagonal2:continuecolumns.add…

反汇编:OllyDBG/objdump分析

一、OllyDBG 1、 2、可以通过file->open的方法打开需要查看的程序 或者是 dll文件 3、反汇编窗口中:各列的含义; 反汇编中的第一列:是指令在内存中存放的地址; 反汇编中的第二列:是所谓的汇编语言中的操作码&…

海洋微生物清净节能剂属于节能环保型产品 我国市场参与者数量不断增长

海洋微生物清净节能剂属于节能环保型产品 我国市场参与者数量不断增长 海洋微生物清净节能剂是一种环保型燃油添加剂,通常以海洋微生物或其代谢产物为基材制成。海洋微生物清净节能剂可以有效降低尾气排放量、改善燃油燃烧效率,在各类燃油设备中拥有广阔…

STM32读写备份寄存器BKP

今天学习的读写STM32的备份寄存器BKP的步骤,这节知识是比较简单的,一共也就两大部: 这个BKP寄存器的意思就是在芯片的VB引脚上接个电池,就能保存其寄存器中的数据掉电不丢失。先来看看电池的接法: 好,下面…

git 清除已提交的记录

git 清除已提交的记录 步骤一 首先确保你本地没有做任何更改 提交你的当前更改: bashCopy codegit add . git commit -m "Committing current changes"执行 rebase 命令: bash Copy code git rebase -i HEAD~2如果你不想保留当前更改&#xf…

使用Github+Picgo+npm实现免费图床

本文参考自 Akilar,原文地址:https://akilar.top/posts/3e956346/ Picgo的配置 Github图床仓库内容不能超过1GB,因为Github原则上是反对仓库图床化的,超过1GB之后会由人工审核仓库内容,如果仓库被发现用来做图床&…

与Apollo共创生态:我们携手远航

目录 小程一言会议记录 回望7年发展展望未来小程有感 小程一言 4月22日,百度Apollo在北京车展前夕举办了以“破晓•拥抱智变时刻”为主题的智能汽车产品发布会。我在观看后也是很是触动 作为在校大学生的我,从大一开始知道Apollo开始,Apollo…

什么是智慧民航?详解实现智慧民航目标的关键工具与技术

一、 智慧民航是什么? 智慧民航是指运用现代信息技术,特别是互联网、大数据、云计算、物联网和人工智能等,对民航业的各个环节进行优化和革新的一种模式。它致力于实现民航服务的个性化、运营的高效化、管理的智能化和监管的精准化&#xf…

六西格玛培训:利弊权衡与企业实践策略探讨

在当今竞争激烈的商业环境中,企业追求卓越品质、降低成本、提升顾客满意度和增强员工能力显得尤为重要。六西格玛培训作为一种卓越的管理方法,正逐渐受到越来越多企业的青睐。它旨在通过严谨的数据分析和流程优化,帮助企业实现持续改进&#…

密文域可逆信息隐藏技术综述(上)

加密图像可逆信息隐藏是一种加密原始图像后,在密文图像中可逆地隐藏附加数据,并且在数据提取后,原始图像可以被无损重建的技术。RDH-EI的分类如图1所示。 按对图像的加密方法,现有RDH-EI算法可分为对称加密域和非对称(公钥)加密域…

机器学习day1

一、人工智能三大概念 人工智能三大概念 人工智能(AI)、机器学习(ML)和深度学习(DL) 人工智能:人工智能是研究计算代理的合成和分析的领域。人工智能是使用计算机来模拟,而不是人类…

Linux网络配置以及DHCP

一、网络配置 将Linux主机接入到网络,需要配置网络相关设置 一般包括如下内容: 主机名 IP/netmask 路由:默认网关 DNS服务器 主DNS服务器 次DNS服务器 第三个DNS服务器 1.1显示网络接口的信息 ifconfig命令用于显示和配置网络接口的信…

STM32使用PWM控制舵机

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. 舵机简介 2. 硬件连接 3. 代码实现 3.1 PWM.c 3.2 PWM.h 3.3 Servo.c 3.4 Servo.h 3.5 main.c 3.6 完整工程文件 PWM和OC输出详解: STM32定时器的OC比较和PWM​​​​​​​ 1. …