QT中的所有事件都是基于QEvent的。例如:QMouseEvent继承自QInputEvent,QInputEvent继承自QEvent。
一. 重写QT事件
1. 以Label做示范,在帮助手册中查询QLabel,搜索event,找到Label带有的事件,我们可以自定义Label然后重写这些事件。
2. 创建myLabel类,随意继承一个父类,然后在代码中将父类改为QLabel(此时要改三个位置:1. 导入的头文件; 2. 继承的父类; 3. cpp中的父类构造)。
3. 在ui中,右键点击Label,将其提升为我们自己的Label(先点击添加,后点击提升),之后就会看到右侧label对象所对应的类更改为myLabel。
4. 为了使Label显示得更直观,我们可以将QFrame中的frameShape从NoShape做修改,可以改为Box等。
5. 在mylabel.h里重写5个事件,并且在mylabel.cpp中实现,事件触发后打印到控制台。
6. QMouseEvent提供了鼠标在窗体内的x、y坐标以及全局的x、y坐标。
7. 可以通过ev->button()来判断按键;可以使用“==”也可以使用“&”;ev->button()可以返回组合件信息。
//鼠标进入
void enterEvent(QEvent *event);
//鼠标离开
void leaveEvent(QEvent *event);
//鼠标按下
void mousePressEvent(QMouseEvent *ev);
//鼠标松开
void mouseReleaseEvent(QMouseEvent *ev);
//鼠标移动
void mouseMoveEvent(QMouseEvent *ev);
//鼠标进入
void myLabel::enterEvent(QEvent *) {
qDebug() << "鼠标进入";
}
//鼠标离开
void myLabel::leaveEvent(QEvent *) {
qDebug() << "鼠标离开";
}
//鼠标按下
void myLabel::mousePressEvent(QMouseEvent *ev) {
qDebug() << "鼠标按下";
if (Qt::LeftButton & ev->button())
qDebug() << QString("x = %1, y = %2, global_x = %3, global_y = %4")
.arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
}
//鼠标松开
void myLabel::mouseReleaseEvent(QMouseEvent *ev) {
qDebug() << "鼠标松开";
if (Qt::LeftButton == ev->button())
qDebug() << QString("x = %1, y = %2, global_x = %3, global_y = %4")
.arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
}
//鼠标移动
void myLabel::mouseMoveEvent(QMouseEvent *ev) {
qDebug() << "鼠标移动";