一、前言
Qt鼠标事件,是重写Qt中虚函数的功能进行具体实现,通过检测鼠标位置可以制作出永远点不到的按钮,或者点击后随机移动的按钮。
下面是鼠标事件和对应函数
鼠标事件 | 函数 |
mousePressEvent | 鼠标点击 |
mouseReleaseEvent | 鼠标弹开 |
mouseMoveEvent | 鼠标移动 |
mouseDoubleClickEvent | 鼠标双击 |
二、原理以及具体实现
1.鼠标点击—mousePressEvent
鼠标点击时进入该函数,可以通过button()方法检测是什么按键点击
左键:Qt::LeftButton
右键:Qt::RightButton
滚轮:Qt::MidButton
侧键前进:Qt::ForwardButton
侧键返回:Qt::BackButton
同时globalPos()和windowPos()输出在窗体中的坐标和在windows框中的坐标
2.鼠标弹起—mouseReleaseEvent
鼠标弹起时进入该函数实现功能
3.鼠标移动—mouseMoveEvent
鼠标移动时进入该函数实现功能
4.鼠标双击—mouseDoubleClickEvent
鼠标双击时进入该函数实现功能
5.随机数—qsrand
生成随机数种子
具体思路:
通过mouseMoveEvent()检测鼠标当前所在坐标,同时与设置的按钮坐标进行比较,当所在坐标属于按钮坐标范围内时,将按钮进行随机数坐标移动
三、源码如下:
#include "mybutton.h"
#include<QMouseEvent>
#include<QTime>
MyButton::MyButton(QWidget *parent) : QPushButton(parent)
{
setMouseTracking(true);
//产生随机数种子
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
}
void MyButton::mouseMoveEvent(QMouseEvent *e)
{
// QWidget *parentW = this->parentWidget();
int current_wid_x = this->x();
int current_wid_y = this->y();
int mouse_x = e ->x();
int mouse_y = e ->y();
if((mouse_x + current_wid_x) >= current_wid_x && ((mouse_x+current_wid_x)<=current_wid_x+this->width()))
{
if((mouse_y+current_wid_y)>=current_wid_y && ((mouse_y+current_wid_y)<=current_wid_y+this->height()))
{
//产生随机数,供给按钮变换,变化后的值,一定要在窗体中
QWidget *parentW =this->parentWidget();
//x
int btn_x = qrand()%(parentW->width()-this->width());
//y
int btn_y = qrand()%(parentW->height()-this->height());
this->move(btn_x,btn_y);
//this->update();
}
}
}