一、介绍
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();
}
四、效果