苦难是没有任何意义的,不然流浪汉就是伟人了;失败也不会孕育成功,导致抑郁还差不多。
1.鼠标事件
在ui界面添加一个QLabel控件Label,并将其提升为myqlabel类。
鼠标进入事件 enterEvent
鼠标离开事件 leaveEvent
鼠标按下 mousePressEvent( QMouseEvent event)
鼠标释放mouseReleaseEvent
鼠标移动mouseMoveEvent
event>x( ) x坐标 event>y( ) y坐标
event->button( )可以判断所有按键 Qt::leftButton Qt::RightButton
event->buttons( )判断组合按键 判断 move 时候的鼠标左右键是否按下 结合 & 操作符
格式化字符串 QString(“%1 %2 ").arg(111 ).arg(222)
设置鼠标追踪 setMouseTracking(true)
myqlabel.h文件
#ifndef MYQLABEL_H
#define MYQLABEL_H
#include <QLabel>
#include <QMouseEvent>
class myQLabel : public QLabel
{
Q_OBJECT
public:
explicit myQLabel(QWidget *parent = nullptr);
void enterEvent(QEnterEvent *event);
void leaveEvent(QEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
bool event(QEvent *e);//用于事件分发,也可用于事件拦截
signals:
};
#endif // MYQLABEL_H
myqlabel.cpp文件
#include "myqlabel.h"
#include <QDebug>
#include <QEvent>
#include <QMouseEvent>
#include <QString>
myQLabel::myQLabel(QWidget *parent)
: QLabel{parent}
{
//设置鼠标的追踪状态
setMouseTracking(true);
};
void myQLabel::enterEvent(QEnterEvent *event)
{
qDebug()<<"鼠标进去了";
};//鼠标进入事件
void myQLabel::leaveEvent(QEvent *event)
{
qDebug()<<"鼠标离开了";
};//鼠标离开事件
void myQLabel::mousePressEvent(QMouseEvent *event)
{
if(event->button() ==Qt::LeftButton)//button判断鼠标左右按键
{
QString str =QString("鼠标按下了x=%1 y=%2 gloabalX=%3 gloabalY=%4").arg(event->x()).arg(event->y()).arg(event->globalX()).arg(event->globalY());//x,y
qDebug()<<str;
}
};//鼠标按下
void myQLabel::mouseReleaseEvent(QMouseEvent *event)
{
if(event->button() ==Qt::LeftButton)
{
QString str =QString("鼠标释放了x=%1 y=%2 gloabalX=%3 gloabalY=%4").arg(event->x()).arg(event->y()).arg(event->globalX()).arg(event->globalY());//x,y
qDebug()<<str;
}
};//鼠标释放
void myQLabel::mouseMoveEvent(QMouseEvent *event)
{
// if(event->buttons() & Qt::LeftButton)//移动是个持续的过程,与按下和释放不同,移动过程中存在左键右键全部按下的状况。所以判断方式不同,所以需要用联合状态buttons来判断,(左键LeftButton值为0x00000001)要求联合状态值为真
// {
QString str =QString("鼠标移动了x=%1 y=%2 gloabalX=%3 gloabalY=%4").arg(event->x()).arg(event->y()).arg(event->globalX()).arg(event->globalY());//x,y
qDebug()<<str;
// }
};//鼠标移动
bool myQLabel::event(QEvent *e)
{
if(e->type() == QEvent::MouseButtonPress)
{
QMouseEvent *event = static_cast<QMouseEvent *>(e);//对Event强制类型转化为mouseEvent
QString str =QString("event事件中鼠标按下了x=%1 y=%2 gloabalX=%3 gloabalY=%4").arg(event->x()).arg(event->y()).arg(event->globalX()).arg(event->globalY());//x,y
qDebug()<<str;
return true;//true代表用户自己处理这个事件,不向下分发
}
return QLabel::event(e);//其他事件交给父类处理
}
2.定时器
ui界面添加三个QLabel控件Label1、Label2、Label3以及一个按钮。
1)定时器 1
利用事件 void timerevent(QTimerEvent* ev)
启动定时器 startTimer(1000) 毫秒单位
timerevent 的返回值是定时器的唯一标示 ,可以和 event->timerld 做比较
2)定时器 2 (利用定时器类 QTimer)
创建定时器对象 QTimer* timer=new QTimer(this)
启动定时器 timer->start(毫秒)
每隔一定毫秒,发送信号timeout,进行监听
暂停 timer->stop
widget.h文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
void timerEvent(QTimerEvent *);
int id1;
int id2;
bool eventFilter(QObject *,QEvent *);//重写事件过滤器事件
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp文件
#include "widget.h"
#include "ui_widget.h"
#include <QTimer>
#include <QMouseEvent>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
id1=startTimer(1000);//启动定时器,并接收返回值,startTimer返回值是定时器是唯一标识。单位是毫秒
id2=startTimer(2000);
QTimer *timer =new QTimer(this);//创建定时器对象
timer->start(500);//启动定时器,毫秒
connect(timer,&QTimer::timeout,[=](){
static int num3 =1;//提升作用域,防止每次调用都从1开始,数值不变化
ui->Label3->setText(QString::number(num3++));
});//第二种定时器的实现方式,推荐
connect(ui->btn,&QPushButton::clicked,[=](){
timer->stop();
});//点击暂停按钮,停止定时器
ui->Label1->installEventFilter(this);//给Label1安装事件过滤器
}
void Widget::timerEvent(QTimerEvent *ev)
{
if(ev->timerId()== id1)
{
static int num1 =1;//提升作用域,防止每次调用都从1开始,数值不变化
ui->Label1->setText(QString::number(num1++));
}
if(ev->timerId()== id2)
{
static int num2 =1;//不同定时器之间通过startTimer返回值来区分
ui->Label2->setText(QString::number(num2++));
}
}//利用事件实现定时器
bool Widget::eventFilter(QObject *obj,QEvent *e)
{
if(obj ==ui->Label1)
{
if(e->type() == QEvent::MouseButtonPress)
{
QMouseEvent *event = static_cast<QMouseEvent *>(e);//对Event强制类型转化为mouseEvent
QString str =QString("事件过滤器中鼠标按下了x=%1 y=%2 gloabalX=%3 gloabalY=%4").arg(event->x()).arg(event->y()).arg(event->globalX()).arg(event->globalY());//x,y
qDebug()<<str;
return true;//true代表用户自己处理这个事件,不向下分发
}
}
return QWidget::eventFilter(obj,e);
}
Widget::~Widget()
{
delete ui;
}
3.事件分发
对于app传输的事件,首先会进行事件分发bool event(QEvent *ev),返回值是布尔类型,如果返回值为真,代表用户需要处理这个事件,则不会将事件继续分发到对应的事件处理函数,event事件也可用于事件拦截,但是不建议使用。
4.事件过滤
事件过滤位于事件分发前,在程序将事件分发到事件分发器前,可以使用事件过滤器进行拦截。