QEvent之QPaintEvent:搭配eventFilter实现窗口悬停时改变边框及图标效果

3 篇文章 0 订阅

一、介绍

QPaintEvent继承自QEvent类,包含了绘图事件的参数如绘图区域(region),以及这片区域对应的矩形(rect);多数场景下,绘图事件并不会用上整个区域,使用rect()方法来获取待更新区域将会比region()、boundingRect()快很多。给窗体发送QPaintEvent事件就可以更新相应窗体,比如更新前景被移除之后暴露出来的背景窗体。

二、场景

父窗体包含了多个同类子窗体,鼠标移动悬停至其中某个窗体时,需要相应窗体切换边框、背景色或图标;当然也可以使用样式表实现悬停时效果,这里介绍的是另一种思路

三、实现

需要对子窗体的构造函数使用setAttribute(Qt::WA_Hover);
以强制Qt在鼠标进入或离开窗体时发送绘图事件

1.声明

继承QVideoWidget并重载其paintEvent和eventFilter方法

class SingelScreen : public QVideoWidget
{
    Q_OBJECT
public:
    explicit SingelScreen(QWidget *parent = nullptr);

protected:
    bool eventFilter(QObject *obj, QEvent *event) override;
    void paintEvent(QPaintEvent *event) override;
}
}

2.实现

bool SingelScreen::eventFilter(QObject *obj, QEvent *event)
{
    if(QEvent:: HoverEnter == event->type())
    {
        m_style = Hovered;
        butOpen->setIcon(*iconOpen);	//更新图标
        repaint();
    }
    else if(QEvent::HoverLeave == event->type())
    {
        m_style = HoverLeave;
        butOpen->setIcon(*iconCamera);
        repaint();
    }
    else
    {
        return QObject::eventFilter(obj,event);	//如果是其它事件则不予处理、未处理的事件将会继续传到至其它事件处理函数或者父窗体
    }
    return true;

}

void SingelScreen::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    QPainter painter(this);
    painter.setBrush(Qt::NoBrush);
    switch (m_style)
    {
    case Normal :
        painter.setPen(QColor(173, 173, 173, 160));
        break;
    case Hovered:
        painter.setPen(Qt::blue);
        break;
    default:
        painter.setPen(QColor(173, 173, 173, 160));
    }

    painter.drawRect(0,0,width()-1,height()-1);

}


SingelScreen::SingelScreen(QWidget *parent) : QVideoWidget(parent),isMax(false),m_id(countScreen),m_style(Normal)
{
    setAttribute(Qt::WA_Hover); //necessary
    installEventFilter(this); //安装事件过滤器
    initUI();

}

四、效果

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值