在 Qt 中,鼠标事件是用 QMouseEvent
实现的。当在窗口中按下鼠标或者移动鼠标时,都会产生鼠标事件
鼠标事件
鼠标点击事件
鼠标按下时通过 虚函数 mousePressEvent()
来捕获的。函数原型如下:
QMouseEvent类
可以通过 button()
函数获取鼠标如何触发该事件(左键/右键…),其函数原型如下:
返回值是 QMouseEvent::Buttons
,这是一个枚举类
- Qt::LeftButton:左键
- Qt::RightButton:右键
- Qt::MidButton:滚轮键按下
代码示例:捕获鼠标按下事件
void Widget::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
qDebug() << "鼠标左键按下";
else if(event->button() == Qt::RightButton)
qDebug() << "鼠标右键按下";
else if(event->button() == Qt::MidButton)
qDebug() << "滚轮中键按下";
}
运行结果如下:
鼠标释放事件
鼠标释放就是按下后,松开的那一瞬
鼠标释放事件是通过 虚函数 mouseReleaseEvent()
捕获的。函数原型如下:
也可以通过 button()
获取是哪个按键释放
代码示例:
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
qDebug() << "鼠标左键释放";
else if(event->button() == Qt::RightButton)
qDebug() << "鼠标右键释放";
else if(event->button() == Qt::MidButton)
qDebug() << "滚轮中键释放";
}
运行结果如下:
mousePressEvent() 是按下就会触发,mouseReleaseEvent() 是松开鼠标才触发
鼠标双击事件
鼠标双击事件通过 虚函数 mouseDoubleClickEvent() 捕获,其函数原型如下:
代码示例:
void Widget::mouseDoubleClickEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
qDebug() << "鼠标左键双击";
}
运行结果如下:
若没有对双击事件进行捕获,也不会触发鼠标按下事件
鼠标移动事件
鼠标移动事件是通过 虚函数 mouseMoveEvent()
捕获的。其函数原型如下:
但是鼠标移动是很频繁触发的,为了保证CPU效率,只重写虚函数不会触发事件处理函数
还需要通过 setMouseTracking()
来追踪鼠标的位置,函数原型如下:
setMouseTracking() 默认是 false,需要设置为 true,才能实时捕获鼠标位置信息。否则只有当鼠标按下时才能捕获其位置信息
代码示例:实时显示鼠标位置
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//设置鼠标追踪捕获
setMouseTracking(true);
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{
//获取鼠标位置
QString pos = QString("[%1, %2]").arg(event->x()).arg(event->y());
qDebug() << "鼠标当前位置:" << pos;
}
运行结果如下:
滚轮事件
在 Qt 中,鼠标滚轮事件是通过 QWheelEvent类
实现的。
通过 虚函数 wheelEvent()
捕获滚轮事件,其函数原型如下:
滚轮滑动的距离可以通过 delta()
函数获取。函数原型如下:
返回值代表滚轮滑动的距离。正数表示滚轮相对于用户向前滑动,负数表示滚轮相对于用户向后滑动
代码示例:记录滑轮滚动的距离
void Widget::wheelEvent(QWheelEvent *event)
{
static int x = 0;
x += event->delta();
if(x > 0)
qDebug() << "滚轮向前滚动:" << x;
else if(x < 0)
qDebug() << "滚轮向后滚动:" << x;
}
运行结果如下:
结束语
感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。