Qt—鼠标移动事件的趣味小程序:会移动的按钮

1.项目目标

本次根据Qt的鼠标移动事件实现一个趣味小程序:当鼠标移动到按钮时,按钮就会随机出现在置,以至于根本点击不到按钮。​​​​​

2.项目步骤

首先现在ui界面设计控件(也可以用代码的方式创建,就不多说了)

第一个按钮不需要移动,所以点击它后只需要一个简单的槽函数把QLabel的文本更改一下即可。

接下来重点是第二个按钮,如何实现它的随机移动从而让鼠标点击不到呢?这个时候就可以用到鼠标移动事件了。当鼠标移动到按钮中,按钮会随机移动,所以我们还需要qrand来进行随机数的设置。

由于是对按钮进行鼠标移动事件,所以我们需要一个继承按钮的类来进行相关设置。

在完成基本配置后,就可以进行后续操作了。接下来就是添加鼠标移动事件的函数了

cpp 复制代码
//在.h文件中添加如下声明代码,点击改行代码按住alt+F4自动给.cpp添加定义代码

void mouseMoveEvent(QMouseEvent* event);//鼠标移动事件

还需要注意的一点是此时并不是真正的随机,所以还需要设置随机数种子,把它设置为当前时间 。

设置完毕后我们运行代码,发现按钮并不会移动,因为我们还没指定某一个按钮去移动它,所以我们需要把第二个按钮的类设置为我们刚刚创建好的类。

此时再运行程序,按钮会移动,成功。

3.代码展示

因为主界面没什么改变,只添加了一个槽函数,所以不展示了,只展示MyEven.h和MyEvent.cpp

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
cpp 复制代码
//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);
        }
    }
}
相关推荐
开开心心就好7 小时前
电子教材下载工具,支持多链接批量下载
windows·随机森林·计算机视觉·pdf·计算机外设·逻辑回归·excel
春日见7 小时前
自动驾驶的四个演进阶段
开发语言·人工智能·驱动开发·matlab·docker·计算机外设
mzhan0178 小时前
电脑:鼠标
计算机外设·电脑
WHD3069 小时前
苏州服务器维修哪家好/公司推荐
linux·ubuntu·centos·计算机外设·电脑·unix·安全架构
ONE_SIX_MIX9 小时前
debian13 无显示器的 服务器,开机不自动加载nvidia 驱动的,解决
运维·计算机外设
Vanranrr1 天前
抛弃“鼠标点点点”,用键盘流把节奏拉满
计算机外设
Saniffer_SH1 天前
【高清视频】实验室搭建PCIe 6.0测试环境需要的retimer卡介绍
服务器·驱动开发·测试工具·fpga开发·计算机外设·硬件架构·压力测试
ACP广源盛139246256731 天前
ASW3810@ACP#4 路差分 2:1/1:2 双向多路复用 / 解复用器 产品规格与应用总结
大数据·单片机·嵌入式硬件·计算机外设·电脑
米饭不加菜2 天前
Windows 键盘快捷方式总览
windows·计算机外设
双翌视觉4 天前
高精度视觉对位实现键盘线路薄膜定位纠偏
数码相机·计算机外设