文章目录
- 事件
- 鼠标事件
- 键盘事件
事件
事件是应用程序内部或者外部产生的事情或者动作的统称。在 Qt 中使用⼀个对象来表示⼀个事件。所有的 Qt 事件均继承于抽象类 QEvent
。
事件是由系统或者 Qt 平台本⾝在不同的时刻发出的。⼀些事件是在用户操作时发出,如键盘事件、鼠标事件等,另⼀些事件则是由系统自动发出,如定时器事件。常见的 Qt 事件如下:
-
QMouseEvent 鼠标事件
-
QKeyEvent 键盘事件
Qt在上级控件中定义了一些事件处理函数,这是一些虚函数,如(例如 QObject::event()
、QWidget::mousePressEvent()
)。对象通过继承上级基类,并重写事件处理函数来处理事件。
事件与信号槽机制
信号槽实际上是Qt为了方便事件处理的实现,抽象出来的一种机制,也就是说事件是信号槽的底层实现,我们在开发中往往使用信号槽居多,事件机制适用于更底层,更贴近系统层面的事件处理。
鼠标事件
QWidget
中关于鼠标的事件
Events | 说明 |
---|---|
mousePressEvent(QMouseEvent *event) | 点按鼠标 |
mouseReleaseEvent(QMouseEvent *event) | 释放鼠标 |
mouseDoubleClickEvent(QMouseEvent *event) | 双击鼠标 |
mouseMoveEvent(QMouseEvent *event) | 移动鼠标 |
enterEvent(QEvent *event) | 鼠标进入控件 |
leaveEvent(QEvent *event) | 鼠标离开控件 |
wheelEvent(QWheelEvent *event) | 滑动鼠标滑轮 |
QMouseEvent
类中一些常用接口
接口 | 说明 |
---|---|
QPoint pos() | 获取鼠标所在坐标 (当前控件内) |
int x() | 横坐标 |
int y() | 纵坐标 |
Qt::MouseButton button() | 返回造成此次事件发生的鼠标按键 (Qt::MouseButton 鼠标按键枚举类型) |
QPoint globalPos() | 获取鼠标所在坐标 (全屏内) |
class Label : public QLabel//自定义Label类,继承自QLabel,重写事件处理函数以自定义事件处理逻辑
{Q_OBJECT
public:Label(QWidget* parent);//重写事件处理函数void mousePressEvent(QMouseEvent *event);void mouseReleaseEvent(QMouseEvent *event);void mouseDoubleClickEvent(QMouseEvent *event);void mouseMoveEvent(QMouseEvent *event);void wheelEvent(QWheelEvent *event);
};
#include "label.h"
#include <QDebug>
#include <QMouseEvent>Label::Label(QWidget* parent) : QLabel(parent)
{}void Label::mousePressEvent(QMouseEvent *event)
{if(event->button() == Qt::LeftButton){qDebug() << "点击了左键";}else if(event->button() == Qt::RightButton){qDebug() << "点击了右键";}qDebug() << event->pos();
}void Label::mouseReleaseEvent(QMouseEvent *event)
{qDebug() << event->x() << " " << event->y();
}void Label::mouseDoubleClickEvent(QMouseEvent *event)
{(void)event;qDebug() << "双击鼠标";
}void Label::mouseMoveEvent(QMouseEvent *event)
{
/* If mouse tracking is switched off, mouse move events only occur if a mouse button is pressed while the mouse is being moved.
*/qDebug() << "move: " << event->pos();
}
特别地,为了提高效率,mouseMoveEvent事件并不会鼠标一移动就触发,那样会发生非常多次!进行以下设置会打开鼠标追踪,不限制鼠标移动事件的触发。
this->setMouseTracking(true);
鼠标滑轮事件
void Label::wheelEvent(QWheelEvent *event)
{//使用鼠标滑轮,改变字体大小QFont font = this->font();int newPointSize = font.pointSize() + event->delta() / 10;if(newPointSize > 0){font.setPointSize(newPointSize);this->setFont(font);}
}
delta()
函数返回滑轮滚动的距离。向前滚动返回正数,向后滚动返回负数。一个滚动单位的数值是120。
键盘事件
QWidget
中关于键盘的事件
Events | 说明 |
---|---|
keyPressEvent(QKeyEvent *event) | 点击键盘按键 |
keyReleaseEvent(QKeyEvent *event) | 释放键盘按键 |
注意,控件必须被聚焦时 (focus on),键盘事件才会发生。
- 单个按键
void Widget::keyPressEvent(QKeyEvent *event)
{qDebug() << event->key();//获取键盘输入的按键是哪个,可以直接使用值,//也可以使用Qt中的内置按键枚举类型Keyif(event->key() == Qt::Key_A){qDebug() << "按下了A键";}else if(event->key() == Qt::Key_B){qDebug() << "按下了B键";}
}
-
组合键
Qt::KeyboardModifier
中定义了在处理键盘事件时对应的修改键。在 Qt 中,键盘事件可以与修改键⼀起使⽤,以实现⼀些复杂的交互操作。