Qt在已存在的控件上绘图

news/2024/5/15 9:39:09

在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.mrgr.cn/p/81023605

相关文章

H2 Database Console未授权访问

H2 Database Console未授权访问 H2 database是一款java内存数据库,多用于单元测试。H2 database自带一个web管理页面,在Spring开发中,如果我们设置如下选项,即可允许外部用户访问WEB管理页面,且没有鉴权; spring.h2.console.enabled=true spring.h2.console.settings.web…

SpringBoot配置HTTPS及开发调试

前言 在实际开发过程中,如果后端需要启用https访问,通常项目启动后配置nginx代理再配置https,前端调用时高版本的chrome还会因为证书未信任导致调用失败,通过摸索整理一套开发调试下的https方案,特此分享 后端配置 生成HTTPS密钥 keytool -genkeypair -alias tomcat -keya…

C# winform 漂亮的日期时间控件

源代码下载: https://download.csdn.net/download/gaoxiang19820514/89242240 效果图在 HZH-Controls控件 基础上修改的日期控件 因为HZH_Controls控件 中的日期控件太大了, 我的程序中需要多个日期时间的控件放不下,主题是绿色的,所以手动调了一下样式。 为了和HZH_Contro…

计算机视觉 CV 八股分享 [自用](更新中......)

目录 一、深度学习中解决过拟合方法 二、深度学习中解决欠拟合方法 三、梯度消失和梯度爆炸 解决梯度消失的方法 解决梯度爆炸的方法 四、神经网络权重初始化方法 五、梯度下降法 六、BatchNorm 七、归一化方法 八、卷积 九、池化 十、激活函数 十一、预训练 十二…

Vue 组件单元测试深度探索:细致解析与实战范例大全

Vue.js作为一款广受欢迎的前端框架,以其声明式的数据绑定、组件化开发和灵活的生态系统赢得了广大开发者的心。然而,随着项目规模的增长,确保组件的稳定性和可靠性变得愈发关键。单元测试作为软件质量的守护神,为Vue组件的开发过程…

免费白嫖证件照

​痛点 直接拍证件照需要花几块钱 自己拍图去换背景掏钱,去抠图掏钱,要么有水印不高清 拍个照 首先有一张照片 ,最后白底,身上衣服和白对立的 ,比如穿个黑色衣服,站在白墙 ,拍个照片,以下为我测试用的原图 ​ 替换背景 手机下载APP (剪映) - 拿它拍照也行,高清美颜…

TiDB 6.x 新特性解读 | Collation 规则

对数据库而言,合适的字符集和 collation 规则能够大大提升使用者运维和分析的效率。TiDB 从 v4.0 开始支持新 collation 规则,并于 TiDB 6.0 版本进行了更新。本文将深入解读 Collation 规则在 TiDB 6.0 中的变更和应用。 引 这里的“引”,…

R语言中取色器 colorfindr测试

需求: 一张图片,想知道到底是什么颜色, 在R语言中的颜色系统中。 测试图片如下: 001、install.packages("colorfindr") ## 安装包 library("colorfindr") ## 加载包get_colors(img = "aa.…

1-Linux集群搭建,分发脚本,ssh免密登录

Linux集群部署集群规划模板机安装创建完成后全部打开并登录root账户修改克隆主机名 vim /etc/sysconfig/network-scripts/ifcfg-ens33 esc退出并输入:wq保存 按i修改IPADDR为192.168.10.101 / 192.168.10.102 / 192.168.10.103vim /etc/hostname 按i修改名字为kafka-broker1…

数据挖掘实验一

一、实验环境及背景 使用软件: Anaconda3 Jupyter Notebook 实验内容: 1.使用Tushare或者其他手段获取任意两支股票近三个月的交易数据。做出收盘价的变动图像。2.使用Pandas_datareader获取世界银行数据库中美国(USA)、瑞典&…

aardio爬虫) 实战篇:采集自己的公众号粉丝列表

前言 只有自己封装库的时候,才知道造轮子有多累。之前使用Python的时候,基本都只需要import,随便哪个功能都有人写好轮子用。不过造轮子也有好处,可以了解一些比较基础的知识。 其实aardio也有很多已经造好的轮子可以用,只是因为只有作者在维护,而且没有一个活跃的社区,…

微信小程序:5.数据绑定

在Data中定义数据早wxml中进行数据使用 在data中定义数据 在页面对应的js对象中找到data,然后把数据进行定义即可 Page({data: {motto: Hello World,userInfo: {avatarUrl: defaultAvatarUrl,nickName: ,},hasUserInfo: false,canIUseGetUserProfile: wx.canIUse…

【火猫体育】NBA:快船艰难击败独行侠,伦纳德成球队毒瘤?

作为西部竞争最激烈的一轮系列赛,快船在G4艰难击败了独行侠,将双方的总比分扳为2比2。本场比赛伦纳德因伤缺阵,快船却一改前两场比赛糟糕的发挥,哈登和乔治通过出色的表现带队赢下了独行侠。正所谓,赢球不可怕缺谁谁尴…

Docker——开源的应用容器的引擎

目录 一、前言 1.虚拟化产品有哪些 1.1寄居架构 1.2源生架构 2.虚拟化产品对比/介绍 2.1虚拟化产品 2.1.1仿真虚拟化 2.1.2半虚拟化 2.1.3全虚拟化 2.2重点 2.2.1KVM——Linux内核来完成的功能和性能 2.2.2ESXI——用的比较多 二、Docker概述 1.Docker定义 2.Do…

(mac)Prometheus监控之Node_exporter(CPU、内存、磁盘、网络等)

完整步骤 1.启动 Prometheus 普罗米修斯 prometheus --config.file/usr/local/etc/prometheus.yml 浏览器访问 http://localhost:9090/targets 2.启动Node_exporter node_exporter 访问:http://localhost:9100 3.启动grafana brew services start grafana 访问…

linx使用命令还原数据库(source还原方式)

进入到数据库mysql -u datatablename -p//参数解析: datatablename 是连接数据库的用户输入数据库密码: 成功进入数据库: 2、可以查看当前用户有哪些数据库权限 show databases;3、进入到指定的数据库use test;//参数解析:test-是数据库名称4、查看当前数据库所有的表show…

【C】---- T4:文件传输速度

编写一个程序,提示用户输入以兆位每秒(Mb/s)为单位的下载速度和以兆字节(MB)为单位的文件大小。程序中应计算文件的下载时间。注意,这里1字节等于8位。使用float类型,并用/作为除号。该程序要打印 3 个变量的值(下载速度、文件大小和下载时间),并且显示小数点后面两位…

Python数组类+AI插件

目录 规划实现初始化插入删除查找 AI插件单测注释调优建议 小结 规划 先想清楚都写哪些,然后再动手操作 用Python写了一个简单数组类,首先思考下都写哪些功能: 插入删除查找用插件做单元测试和写注释 目的只是实现一个简单的数组类&#x…

openGauss MOT内存和存储规划

MOT内存和存储规划 本节描述了为满足特定应用程序需求,在评估、估计和规划内存和存储容量数量时,需要注意的事项和准则,以及影响所需内存数量的各种数据,例如计划表的数据和索引大小、维持事务管理的内存以及数据增长的速度。 MOT内存规划 MOT是一种内存数据库存储引擎(IM…

Strassen矩阵乘法——C++

【题目描述】 根据课本“Strassen矩阵乘法”的基本原理,设计并实现一个矩阵快速乘法的工具。并演示至少10000维的矩阵快速乘法对比样例。 【功能要求】 实现普通矩阵乘法算法和“Strassen矩阵乘法”算法对相同的矩阵,分别用普通矩阵乘法算法&#xff…