Qt鼠标事件—实现移动按钮

一、前言

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();
        }
   }
}

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中,你可以使用拖放操作来将按钮(或其他控件)拖动到容器控件中。下面是一个简单的示例,展示如何实现这个功能: 1. 首先,在容器控件的类中,你需要启用拖放操作。这可以通过在构造函数中设置setAcceptDrops(true)来完成。 ```cpp ContainerWidget::ContainerWidget(QWidget *parent) : QWidget(parent) { setAcceptDrops(true); } ``` 2. 然后,在按钮(或其他控件)的类中,你需要实现拖放事件。这包括mousePressEvent、mouseMoveEvent和drag事件。 ```cpp ButtonWidget::ButtonWidget(QWidget *parent) : QPushButton(parent) { // 设置按钮可拖动 setDragEnabled(true); } void ButtonWidget::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { // 鼠标左键按下时,开始拖动按钮 QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; mimeData->setText(text()); // 设置拖动数据为按钮的文本 drag->setMimeData(mimeData); drag->exec(Qt::MoveAction); } } void ButtonWidget::mouseMoveEvent(QMouseEvent *event) { if (event->buttons() & Qt::LeftButton) { // 鼠标左键按下并移动时,移动按钮 QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; mimeData->setText(text()); // 设置拖动数据为按钮的文本 drag->setMimeData(mimeData); drag->exec(Qt::MoveAction); } } ``` 3. 最后,在容器控件的类中,你需要实现拖放事件。这包括dragEnterEvent和dropEvent。 ```cpp void ContainerWidget::dragEnterEvent(QDragEnterEvent *event) { if (event->mimeData()->hasText()) { event->acceptProposedAction(); } } void ContainerWidget::dropEvent(QDropEvent *event) { if (event->mimeData()->hasText()) { QString buttonText = event->mimeData()->text(); ButtonWidget *button = new ButtonWidget(this); button->setText(buttonText); button->move(event->pos()); button->show(); event->acceptProposedAction(); } } ``` 现在,你可以创建一个容器控件和多个按钮控件,并将这些按钮拖动到容器控件中。按钮会在容器中显示,并且你可以随意移动它们。 希望这可以帮助到你!如果有任何进一步的问题,请随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值