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

Qt关于窗口一直调用paintEvent的踩坑实录

首先看以下代码:

void ItemBlockWidget::paintEvent(QPaintEvent *ev) {// 先调用父类的 paintEvent 以执行默认绘制行为QWidget::paintEvent(ev);qDebug()<<"ItemBlockWidget重绘";QStyleOption opt;opt.initFrom(this);QPainter p(this);style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);p.setRenderHint(QPainter::Antialiasing, true);// 如果鼠标悬停,绘制半透明蒙层if (this->m_isHoverCoverLab) {this->m_mask->show();this->m_mask->raise();this->m_popularBtn->setStyleSheet(QStringLiteral("color:white;border-radius:10px;background-color: rgba(60,60,60, 127);"));} else {this->m_popularBtn->setStyleSheet(QStringLiteral("color:white;border-radius:10px;background-color: rgba(128, 128, 128, 127);"));this->m_mask->hide();}
}

我一开始的目的是让窗口在绘制的时候考虑到是否鼠标悬停在该控件上方从而判断遮罩是否出现以及控制流行按钮的样式,从而达到不同的显示效果,但是一但运行会发现他一直在调用paintEvent

函数,如图:

通常来说遇到这种情况一般都是首先会考虑 是否在其他地方频繁调用了update或者repaint函数,但是在意料之中,我并没有频繁调用这两种函数,那么问题就复杂了,一下还摸不着头脑,通过一系列手段得知,问题出在样式表的设置,它不应该出现在paintEvent函数里面!!!!!!!

修改如下:
 


void ItemBlockWidget::paintEvent(QPaintEvent *ev) {// 先调用父类的 paintEvent 以执行默认绘制行为QWidget::paintEvent(ev);qDebug()<<"ItemBlockWidget重绘";QStyleOption opt;opt.initFrom(this);QPainter p(this);style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);p.setRenderHint(QPainter::Antialiasing, true);// 如果鼠标悬停,绘制半透明蒙层/*if (this->m_isHoverCoverLab) {this->m_mask->show();this->m_mask->raise();this->m_popularBtn->setStyleSheet(QStringLiteral("color:white;border-radius:10px;background-color: rgba(60,60,60, 127);"));} else {this->m_popularBtn->setStyleSheet(QStringLiteral("color:white;border-radius:10px;background-color: rgba(128, 128, 128, 127);"));this->m_mask->hide();}*/
}void ItemBlockWidget::enterEvent(QEnterEvent *ev) {// 先调用父类的 paintEvent 以执行默认绘制行为QWidget::enterEvent(ev);if(!this->m_isHoverCoverLab) {this->m_isHoverCoverLab = true;this->m_mask->show();this->m_mask->raise();this->m_popularBtn->setStyleSheet(QStringLiteral("color:white;border-radius:10px;background-color: rgba(60,60,60, 127);"));update();}}void ItemBlockWidget::leaveEvent(QEvent *ev) {// 先调用父类的 paintEvent 以执行默认绘制行为QWidget::leaveEvent(ev);if(this->m_isHoverCoverLab) {this->m_isHoverCoverLab = false;this->m_popularBtn->setStyleSheet(QStringLiteral("color:white;border-radius:10px;background-color: rgba(128, 128, 128, 127);"));this->m_mask->hide();update();}
}

成功解决问题。。。

http://www.lryc.cn/news/492707.html

相关文章:

  • C++11: STL之bind
  • 在线音乐播放器 —— 测试报告
  • 等保测评讲解:安全管理中心
  • vue3表单输入相关修饰符使用
  • CSS笔记(二)类名复用
  • TCP三次握手与四次挥手(TCP重传机制,2MSL)超详细!!!计算机网络
  • LCR 006. 两数之和 II - 输入有序数组
  • 网络安全在现代企业中的重要作用
  • 关于 EKS Bottlerocket AMI 版本与 Karpenter 配置的说明
  • Python实现人生重开模拟器
  • java——Spring Boot的配置加载顺序和优先级
  • 【21-30期】Java技术深度剖析:从分库分表到微服务的核心问题解析
  • CSS:怎么把网站都变成灰色
  • 开发一个基于MACOS M1/2芯片的Android 12的模拟器
  • Flink 中 JDBC Connector 使用详解
  • 【Linux打怪升级记 | 报错02】-bash: 警告:setlocale: LC_TIME: 无法改变区域选项 (zh_CN.UTF-8)
  • 未来已来?AI技术革新改变我们的生活
  • 【Linux】进程的生命之旅——诞生、消逝与守候(fork/exit/wait)
  • 使用vcpkg自动链接tinyxml2时莫名链接其他库(例如boost)
  • 【去毛刺】OpenCV图像处理基础:腐蚀与膨胀操作入门
  • 道可云人工智能元宇宙每日资讯|第三届京西地区发展论坛成功召开
  • 若依框架部署在网站一个子目录下(/admin)问题(
  • 【ue5】UE5运行时下载视频/UE5 runtime download video(MP4)
  • 对比C++,Rust在内存安全上做的努力
  • 如何利用 Qt 的模块化架构组织大型项目
  • 探索Python词云库WordCloud的奥秘
  • MySQL根据idb文件恢复数据
  • hadoop-mapreduce词频统计
  • 精心修炼Java并发编程(JUC)-volatile与synchronized关键字
  • 【ROS2】ROS2 与 ROS1 编码方式对比(Python实现)