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);
        }
    }
}
相关推荐
caimouse17 小时前
ReactOS 窗口系统分析(23):键盘 — keyboard.c + kbdlayout.c
c语言·开发语言·计算机外设
bj_bluewei_tech2 天前
拯救者键盘部分按键失灵,换键盘无效,需要排查主板键盘控制芯片
计算机外设·电脑
qq_513728042 天前
浏览器配置 + 文件上传 + 截图
python·selenium·测试工具·计算机外设
coding4u2 天前
Mac 多桌面(Spaces)的正确用法:你的屏幕可以大三倍
macos·docker·计算机外设·文件管理·策略模式
杨丰玮4183 天前
从零手写Java飞机躲障碍游戏|Swing绘图、鼠标跟随、计时器碰撞检测实战(四)
java·游戏·计算机外设
YOLO数据集集合3 天前
火情监测新方案:无人机红外-可见光多模态火点烟雾数据集(含YOLOv11实战)
人工智能·yolo·计算机外设·无人机·无人机数据集·可见光多模态
杨丰玮4183 天前
从零手写Java飞机躲障碍游戏|Swing绘图、鼠标跟随、计时器碰撞检测实战(二)
java·游戏·计算机外设
码艺-Alimjan3 天前
横向滚动组件纯用 CSS,丝滑鼠标滚动不许js
javascript·css·计算机外设
Nomarsgo5 天前
柔性生产平台工业显示解决方案——基于联控 Lionconit IFD-1901 工业显示器打造高可靠人机交互终端
人工智能·科技·计算机外设·视觉检测·电脑·人机交互·制造
daols885 天前
解决 vxe-table 全键盘操作编辑单元格时,如果是中文拼音输入法时,解决首字母丢失问题
计算机外设