Qt—鼠标移动事件的趣味小程序:会移动的按钮
1.项目目标
本次根据Qt的鼠标移动事件实现一个趣味小程序:当鼠标移动到按钮时,按钮就会随机出现在置,以至于根本点击不到按钮。
2.项目步骤
首先现在ui界面设计控件(也可以用代码的方式创建,就不多说了)
第一个按钮不需要移动,所以点击它后只需要一个简单的槽函数把QLabel的文本更改一下即可。
接下来重点是第二个按钮,如何实现它的随机移动从而让鼠标点击不到呢?这个时候就可以用到鼠标移动事件了。当鼠标移动到按钮中,按钮会随机移动,所以我们还需要qrand来进行随机数的设置。
由于是对按钮进行鼠标移动事件,所以我们需要一个继承按钮的类来进行相关设置。
在完成基本配置后,就可以进行后续操作了。接下来就是添加鼠标移动事件的函数了
//在.h文件中添加如下声明代码,点击改行代码按住alt+F4自动给.cpp添加定义代码void mouseMoveEvent(QMouseEvent* event);//鼠标移动事件
还需要注意的一点是此时并不是真正的随机,所以还需要设置随机数种子,把它设置为当前时间 。
设置完毕后我们运行代码,发现按钮并不会移动,因为我们还没指定某一个按钮去移动它,所以我们需要把第二个按钮的类设置为我们刚刚创建好的类。
此时再运行程序,按钮会移动,成功。
3.代码展示
因为主界面没什么改变,只添加了一个槽函数,所以不展示了,只展示MyEven.h和MyEvent.cpp
//MyEvent.h#ifndef MYEVENT_H
#define MYEVENT_H#include <QWidget>
#include <QPushButton>class MyEvent : public QPushButton
{Q_OBJECT
public:explicit MyEvent(QWidget *parent = nullptr);void mouseMoveEvent(QMouseEvent* event);//鼠标移动事件signals:};#endif // MYEVENT_H
//MyEvent.cpp#include <QTime>MyEvent::MyEvent(QWidget *parent) : QPushButton(parent)
{setMouseTracking(true);qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));//设置为按当前时间
}void MyEvent::mouseMoveEvent(QMouseEvent* event)
{int current_x=this->x();//获取按钮的x轴坐标int current_y=this->y();//获取按钮的轴坐标int mouse_x=event->x();//获取鼠标的x轴坐标int mouse_y=event->y();//获取鼠标的y轴坐标if((current_x+mouse_x>=mouse_x)&&(current_x+mouse_x<=current_x+this->width())){if((current_y+mouse_y>=current_y)&&(current_y+mouse_y<=current_y+this->height())){//按钮应该在父容器里面移动,不能超出QWidget *parent=this->parentWidget();//获取父类,也就是QWidget对象//取x轴和y轴的随机值int btn_x=qrand()%(parent->width()-this->width());int btn_y=qrand()%(parent->height()-this->height());this->move(btn_x,btn_y);}}
}