首页 > 其他分享 >Qt关于窗口一直调用paintEvent的踩坑实录

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

时间:2024-11-24 18:35:05浏览次数:5  
标签:Qt color mask 实录 60 paintEvent 128 ev

首先看以下代码:

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();
    }
}

成功解决问题。。。

标签:Qt,color,mask,实录,60,paintEvent,128,ev
From: https://blog.csdn.net/m0_74091159/article/details/144003664

相关文章

  • KTL 一个支持C++14写公式的K线工具 - 0.9.2版,通达信mdt全景数据复盘大盘,Qt自定义图表
    K,K线,Candle蜡烛图。T,技术分析,工具平台L,公式Language语言使用c++14,Lite小巧简易。项目仓库:https://github.com/bbqz007/KTL    国内仓库:https://gitee.com/bbqz007/KTL 当前0.9.2新添加功能基于QCharts跟通达信mdt数据文件。使用者能够使用QCharts自定义数据处理图表。......
  • 按键 芯片型号qt2160 linux驱动程序
    /*qt2160.c-AtmelAT42QT2160TouchSenseControllerThisprogramisfreesoftware;youcanredistributeitand/ormodifyitunderthetermsoftheGNUGeneralPublicLicenseaspublishedbytheFreeSoftwareFoundation;eitherversion2oftheLicense,o......
  • 【QT】绘图
    个人主页~绘图一、绘图1、基础内容2、绘制形状(1)线段(2)矩形(3)圆形(4)文本(5)画笔(6)画刷3、绘制图片(1)简单图片(2)旋转图片4、其他(1)移动画家位置(2)保存、加载画家的状态5、其他(1)QPixmap(2)QImage修改像素点(3)QPicture一、绘图1、基础内容绘图可以帮助我们实现应对多种场景......
  • 作为前端工程师,不了解MQTT,只知道HTTP,那就是不合格啦。
    作为前端开发工程师,了解MQTT(MessageQueuingTelemetryTransport)协议是很有必要的。MQTT是一种轻量级的消息传输协议,主要用于物联网(IoT)设备之间的通信。一、MQTT协议特点轻量级MQTT协议设计简洁,占用带宽小,对硬件资源要求低,非常适合在资源受限的设备上使用,如传感器、嵌......
  • 我开发了许多智能家居设备,支持通过MQTT接入home Assitant ,我想用php开发一个网站,通过
    您好,您想开发一个PHP网站,通过OpenAI的API和FunctionCalling功能,实现智能家居的控制。这是一个非常有趣的项目,下面我将为您提供实现思路和步骤。1.整体架构思路用户界面(PHP网站):用户可以在网站上与AI进行聊天。OpenAIAPI交互:将用户的输入发送给OpenAI的API,使用Functio......
  • 3. 使用Docker部署MQTT平台mosquitto到云服务器
    3.使用Docker部署MQTT平台mosquitto到云服务器1.拉取MosquittoDocker镜像(这里选择拉取1.6.14版本,因为最新版本报错Addressnotavailable)dockerpulleclipse-mosquitto#或者拉取1.6.14版本dockerpulleclipse-mosquitto:1.6.142.创建mosquitto配置文件在运......
  • Qt开发技巧(十九):定时器的调用问题,控件的透明问题,慎用事件过滤器,依赖库的路径链接,对话框
    继续讲一些Qt开发中的技巧操作:1.定时器的调用问题有一个场景经常遇到,那就是在符合某个条件下,延时一段时间去执行一段代码,如果短时间内触发多次又不需要频繁执行,只需要执行一次就行。如果选择用QTimer::singleShot无法终止已经触发的,这个时候就要主动实例化一个单次定时器,......
  • QtCreator通过CMake多文件编译.cpp、.qss、.h、.ui文件,达到MVC三层架构的效果
        博主在构建C++项目的时候,一般都喜欢将头文件和源文件分开为不同的文件夹,比如include目录下只存放.h文件和.ui文件,src目录下只存放.cpp和.qss文件,res目录下只存放图片、音频等文件,这时候使用CMake对项目进行分文件管理就特别方便和清晰了。  很多人写qt项目的......
  • [QT基础系列]标签QLabel
    标签QLabelQLabel是Qt中的标签类,通常用于显示提示性的文本,也可以显示图像文本可以获取和设置按钮上显示的文本//获取和设置显示的文本QStringtext()const;voidsetText(constQString&text);对齐方式用于设置标签中的内容在水平和垂直两个方向上的对齐方式......
  • 实现Qtextedit控件大小改变时候希望不重新绘制
    实现Qtextedit控件大小改变时候希望不重新绘制4.备选方案5.完整示例6.总结要在QTextEdit控件大小改变时防止其重新绘制,可以通过创建一个自定义的QTextEdit子类,并重载相关事件来控制绘制行为。以下是实现这一目标的详细步骤和示例代码:创建自定义的QTextEdit......