蝴蝶飞案例(Event)(EventFilter)

MyWidget.h:


#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include<QDebug>
#include<QPainter>
#include<windows.h>
#include<QMouseEvent>
#include<QEvent>
QT_BEGIN_NAMESPACE
namespace Ui { class MyWidget; }
QT_END_NAMESPACE

class MyWidget : public QWidget
{
    Q_OBJECT

public:
    MyWidget(QWidget *parent = nullptr);
    ~MyWidget();
protected:
    void paintEvent(QPaintEvent *event);
    void timerEvent(QTimerEvent *event);
    //bool eventFilter(QObject *watched, QEvent *event);
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent* e);
    //bool event(QEvent *event);
private:
    Ui::MyWidget *ui;
    //两张切换的照片
    QPixmap up;
    QPixmap down;
    //坐标
    int x,y;
    //计时器
    int timeid;
    //图片切换
    bool flag;
    QPoint p;

};
#endif // MYWIDGET_H

MyWidget.cpp:

#include "mywidget.h"
#include "ui_mywidget.h"

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MyWidget)
{
    ui->setupUi(this);
    //加载照片
    up.load("../Image/hy.jpg");
    down.load("../Image/123.jpg");
    //坐标初始化
    x=0;
    y=0;
    //计时器设置
    timeid=startTimer(250);
    //去除边框
    setWindowFlag(Qt::FramelessWindowHint);//0x800
    //透明窗口
    setAttribute(Qt::WA_TranslucentBackground);//120
    //窗口最大化(带窗口)
    showMaximized();
    flag=true;
    //随机数
    srand(GetTickCount());
    //过滤器
    installEventFilter(this);
}

MyWidget::~MyWidget()
{
    delete ui;
}
void MyWidget::paintEvent(QPaintEvent *event)
{
    QPainter p(this);
    //切换照片
    if(flag==true)
    {
        p.drawPixmap(x,y,200,200,up);
    }
    if(flag==false)
    {
        p.drawPixmap(x,y,200,200,down);
    }
}
void MyWidget::timerEvent(QTimerEvent *event)
{
    if(event->timerId()==timeid)
    {
        x+=rand()%20;
        y+=rand()%20;
        flag=!flag;
        update();
    }
}
void MyWidget::mousePressEvent(QMouseEvent *event)
{
    if(event->button()==Qt::RightButton)
    {
        close();
    }
    if(event->button()==Qt::LeftButton)
    {
        p=event->globalPos()-frameGeometry().topLeft();
    }
}

void MyWidget::mouseMoveEvent(QMouseEvent* e)
{
    move(e->globalPos()-p);
}

QEvent事件:

//一般写在子窗口中
//1.过滤事件(建议,只用来过滤事件,)
//2.重写事件(不建议,写的多了容易出错)
bool MyWidget::event(QEvent *event)
{
    if(event->type()==QEvent::MouseMove)
    {
        return true;//return true将move事件过滤
    }
    if(event->type()==QEvent::MouseButtonPress)
    {
        return true;//过滤鼠标按下事件
        //return false;
        //将事件返回父窗口,如果现在event事件是在QLabel下,
        //则QLabel的鼠标按下事件不执行,开始执行父窗口QWidget的鼠标按下事件
    }
    if(event->type()==QEvent::Timer)
    {
        return true;//将定时器事件过滤
    }

    return QWidget::event(event);
}

QEventFilter事件:

//1.需要过滤窗口的事件,需要给该窗口安装过滤器,让事件进入不到该窗口
//2.需要在事件过滤器中处理该事件
bool MyWidget::eventFilter(QObject *watched, QEvent *event)
{
    //判断对象
    //Qlabel  QWidget  QObject
    if(watched==this)
    {
        if(event->type()==QEvent::MouseButtonPress)
        {
            QMouseEvent* e=static_cast<QMouseEvent*>(event);
            if(e->button()==Qt::RightButton)
            {
                qDebug()<<"123123123123";
                return true;//过滤鼠标右键按下事件
                //return false;
                //如果现在event事件再MyWidget下,安装ui->label过滤器,
                //则QLabel的鼠标按下事件不执行
            }
        }
    }

    return QWidget::eventFilter(watched,event);
}

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值