目录
一、鼠标事件
以 QLabel 控件的鼠标事件为例:
1、需要知道有哪些鼠标事件
enum QEvent::Type
2、需要知道QLabel控件的鼠标事件的处理函数
3、编写QLabel控件的鼠标事件的处理函数
获取x y坐标:ev->x() ev->y()
格式化字符串:QString("%1, %2").arg(111).arg(222)
判断所有按键:ev->button(),按键键值如下
重点内容:
QString str = QString("鼠标按下了,x=%1,y=%2").arg(ev->x()).arg(ev->y());
if (ev->button() == Qt::LeftButton) //左键按下判断
{
QString str = QString("鼠标按下了,x=%1,y=%2").arg(ev->x()).arg(ev->y());
qDebug() <<str.toUtf8().data();
}
全部内容:
#include <QLabel>
#include <QEvent>
#include <QMouseEvent>
class mylabel : public QLabel
{
Q_OBJECT
public:
explicit mylabel(QWidget *parent = 0);
virtual void enterEvent(QEvent *event);//鼠标进入事件 虚函数重写
virtual void leaveEvent(QEvent *event);//鼠标离开事件 虚函数重写
virtual void mouseMoveEvent(QMouseEvent * ev);//鼠标移动事件 虚函数重写
virtual void mousePressEvent(QMouseEvent * ev);//鼠标按下事件 虚函数重写
virtual void mouseReleaseEvent(QMouseEvent * ev);//鼠标释放事件 虚函数重写
signals:
public slots:
};
#include "mylabel.h"
#include "QDebug"
#include "QString"
mylabel::mylabel(QWidget *parent) : QLabel(parent)
{}
//鼠标进入事件
void mylabel::enterEvent(QEvent *event)
{qDebug() <<"鼠标进入";}
//鼠标离开事件
void mylabel::leaveEvent(QEvent *event)
{ qDebug() <<"鼠标离开";}
//鼠标移动事件 虚函数重写
void mylabel::mouseMoveEvent(QMouseEvent * ev)
{qDebug() <<"鼠标移动";}
//鼠标按下事件 虚函数重写
void mylabel::mousePressEvent(QMouseEvent * ev)
{
if (ev->button() == Qt::LeftButton) {//左键按下判断
//格式化字符串
QString str = QString("鼠标按下了,x=%1,y=%2").arg(ev->x()).arg(ev->y());
qDebug() <<str.toUtf8().data();}
}
//鼠标释放事件 虚函数重写
void mylabel::mouseReleaseEvent(QMouseEvent * ev)
{qDebug() <<"鼠标释放";}
二、定时器实现方法
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{
ui->setupUi(this);
//定时器的第一种方法:通过定时器事件和重写定时器处理函数
//启动定时器,周期单位ms
//timer1_id = startTimer(1000);
//timer2_id = startTimer(10000);
//定时器的第二种方法:通过定时器类
QTimer *timer = new QTimer(this);
timer->start(500);
connect(timer, &QTimer::timeout, [=](){
static int num = 1;
ui->label->setNum(num++);
});
//通过点击按钮停止定时器
connect(ui->btn_stop, &QPushButton::clicked, [=](){
if (timer->isActive())
timer->stop();
else
timer->start(500);
});
}
Widget::~Widget()
{
delete ui;
}
//定时器的第一种方法:重写定时器事件处理函数
void Widget::timerEvent(QTimerEvent *ev)
{
static int num = 1;
if (ev->timerId() == timer1_id){
ui->label->setNum(num++);
} else if (ev->timerId() == timer2_id){
num = 1;
}
}
1、定时器事件
1、 QEvent::Timer 事件
2、QEvent::Timer 事件的处理函数是 void timerEvent(QTimerEvent *ev)
3、启动定时器 startTimer(1000) 毫秒,返回定时器的唯一标识ID
4、有多个定时器时,可以对比startTimer()返回的定时器ID 和 通过 QTimerEvent->timerid() 获取的QTimerEvent事件中的定时器ID,该ID就是startTimer()返回的定时器ID
2、定时器类QTimer
1、创建定时器 QTimer *timer = new QTimer(this);
2、启动定时器 timer->start(500);
3、通过 timeout 信号,绑定信号和槽
三、event事件分发器
bool QObject::event(QEvent *e) 事件分发器,可以在QObject的派生类中重写该虚函数,自定义事件的分发,实际开发中不建议这样做!!https://www.cnblogs.com/zhaobinyouth/p/7688954.html
//重写event事件分发器,拦截鼠标按下事件,实际工程并不会拦截!!!!!
bool mylabel::event(QEvent *e)
{
//自己处理按钮 按下事件
if (e->type() == QEvent::MouseButtonPress)
{
QMouseEvent *ev = dynamic_cast<QMouseEvent *>(e);//类型转换,将父类对象转为子类对象
QString str = QString("Event函数中,鼠标按下了,x=%1,y=%2").arg(ev->x()).arg(ev->y());
qDebug() <<str.toUtf8().data();
return true;//表示该事件已经被处理了,true代表用户自己处理这个事件 不向下分发
}
//其他事件交给父类处理,默认处理
return QLabel::event(e);
}
四、event事件过滤器
在程序将事件分发到事件分发器前,可以利用过滤器做拦截