事件就是处理来自鼠标键盘等的信号
----------------------------------------------------
派生标签
.h文件
#ifndef MYABEL_H
#define MYABEL_H
#include <QWidget>
#include<QLabel>
class myabel : public QLabel
{
Q_OBJECT
public:
explicit myabel(QWidget *parent = nullptr);
protected:
//鼠标点击事件
void mousePressEvent(QMouseEvent *ev)override;
//鼠标施放事件
void mouseReleaseEvent(QMouseEvent *ev) override;
//鼠标移动事件
void mouseMoveEvent(QMouseEvent *ev) override;
//进入窗口事件
void enterEvent(QEvent*e);
//离开窗口事件
void leaveEvent(QEvent*e);
signals:
};
#endif // MYABEL_H
.cpp文件
#include "myabel.h"
#include<QMouseEvent>
#include<QString>
#include<QDebug>
myabel::myabel(QWidget *parent) : QLabel(parent)
{
this->setMouseTracking(true);//设置默认追踪鼠标,这样的话就可以不点击而获取鼠标移动的坐标
}
//处理鼠标点击的信息,获取鼠标点击的坐标,并且输出,以及判断按下的是左还是右
void myabel::mousePressEvent(QMouseEvent *ev)
{
int i=ev->x();
int j=ev->y();
if(ev->button()==Qt::LeftButton)
{
qDebug()<<"按下了鼠标左键!";
}
else if(ev->button()==Qt::RightButton)
{
qDebug()<<"按下了鼠标右键!";
}
else if(ev->button()==Qt::MidButton)
{
qDebug()<<"按下了鼠标中间的按键!";
}
QString text=QString("<center><h1>Mouse Press:(%1,%2)</h1></center>")
.arg(i).arg(j);
this->setText(text);
}
void myabel::mouseReleaseEvent(QMouseEvent *ev)
{
QString text=QString("<center><h1>Mouse Release:(%1,%2)</h1></center>")
.arg(ev->x()).arg(ev->y());
this->setText(text);
}
//注意:只有在第一次点击完毕鼠标之后才会调用这个函数
void myabel::mouseMoveEvent(QMouseEvent *ev)
{
QString text=QString("<center><h1>Mouse Move:(%1,%2)</h1></center>")
.arg(ev->x()).arg(ev->y());
//this->setText(text);//如果要看鼠标移动的效果,就只能屏蔽这条语句。
}
void myabel::enterEvent(QEvent *e)
{
QString text=QString("<center><h1>Mouse enter</h1></center>");
this->setText(text);
}
void myabel::leaveEvent(QEvent *e)
{
QString text=QString("<center><h1>Mouse leave</h1></center>");
this->setText(text);
}
-------------------------------------------------------------------------------------
窗口
.h文件
#ifndef EVENT_H
#define EVENT_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class event; }
QT_END_NAMESPACE
class event : public QWidget
{
Q_OBJECT
public:
event(QWidget *parent = nullptr);
~event();
protected:
//键盘按下事件
void keyPressEvent(QKeyEvent *event) override;
//计时器事件
void timerEvent(QTimerEvent*e);
private:
Ui::event *ui;
int timeId;
int other_time_id;
};
#endif // EVENT_H
.cpp文件
#include "event.h"
#include "ui_event.h"
#include<QDebug>
#include<QKeyEvent>
event::event(QWidget *parent)
: QWidget(parent)
, ui(new Ui::event)
{
ui->setupUi(this);
//使得定时器开始,timeId获取计时器的编号(个人理解)
timeId=this->startTimer(1000);//计时器以毫秒为单位,这个函数传参是每隔多少毫秒触发一次
other_time_id=startTimer(500);
}
event::~event()
{
delete ui;
}
void event::keyPressEvent(QKeyEvent *event)
{
qDebug()<<(char)event->key();
if(event->key()==Qt::Key_A)
{
QString str=QString("<center><h1>一见你就笑</h1></center>");
ui->label->setText(str);
}
}
void event::timerEvent(QTimerEvent *e)
{
static int sec=0;
sec++;
//像下面这样获取并且判断计时器的id是必要的,因为不判断获取的id的话就会导致相应的计时器操作发生BUG
if(e->timerId()==timeId)
{
ui->label->setText(QString("<center><h1>timer out:%1</h1></center>").arg(sec));
//当计时器累加到5的时候就停止计时
if(sec==5)
this->killTimer(timeId);
}
else if(e->timerId()==other_time_id)
{
ui->label_2->setText(QString("<center><h1>timer out:%1</h1></center>").arg(sec));
}
}
----------------------------------------------------------------------------------------------------------
运行:
上下两个计时器事件,上面的比较慢,在计时到5的时候会停止,下面的比较快,不会停止
鼠标移动进入窗口
鼠标移动离开窗口
鼠标点击窗口(按下不放)
鼠标松开
而且本来可以打印出鼠标不点击时的在各个屏幕上的坐标,但是由于要看其他内容所以屏蔽了
如果有两个计时器,那么需要对两个计时器分开进行处理获取计时器ID,从而分开操作。