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