Qt事件处理-鼠标事件

这篇博客探讨了Qt框架中的鼠标事件处理,包括控件的拖拽操作。通过示例代码drag.h和drag.cpp,展示了如何实现鼠标事件监听及改变控件背景颜色等功能,这些功能可以通过Qt的样式表stylesheet来定制。

键盘事件定义于qwidget类,描述鼠标事件.

void mousePressEvent(QMouseEvent* event);//鼠标按下
void mouseReleaseEvent(QMouseEvent* event);//鼠标抬起
void mouseDoubleClickEvent(QMouseEvent* event);//鼠标释放(抬起)
void mouseMoveEvent(QMouseEvent* event);//鼠标移动

案例

控件拖拽

 改变背景颜色等在样式表中stylesheet中

drag.h

#ifndef DRAG_H
#define DRAG_H

#include <QDialog>
#include <QMouseEvent>//鼠标事件类
#include <QDebug>

QT_BEGIN_NAMESPACE
namespace Ui { class Drag; }
QT_END_NAMESPACE

class Drag : public QDialog
{
    Q_OBJECT

public:
    Drag(QWidget *parent = nullptr);
    ~Drag();

private:
    Ui::Drag *ui;
    bool m_flag;//标记是否选中脱拽控件
    //鼠标移动要保证控件和鼠标的相对位置不变,需要计算相对位置
    QPoint m_point;//鼠标和拖拽控件的相对位置

    void mousePressEvent(QMouseEvent *event);//鼠标按下事件
    void mouseReleaseEvent(QMouseEvent *event);//鼠标释放事件
    void mouseMoveEvent(QMouseEvent *event);//鼠标移动
};
#endif // DRAG_H

drag.cpp

#include "drag.h"
#include "ui_drag.h"

Drag::Drag(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::Drag)
{
    ui->setupUi(this);
}

Drag::~Drag()
{
    delete ui;
}

void Drag::mousePressEvent(QMouseEvent *event)
{
    //判断鼠标是否按下左键,event->button()返回qt宏
    if(event->button() == Qt::LeftButton)
    {
        //得到label区域
        QRect rect = ui->label->frameRect();
        //将rect和label区域重合,初始坐标rect(0,0),lable(是我们自己定义的)
        rect.translate(ui->label->pos());

        //如果鼠标在rect区域按下左键
        //contains 包含的意思,event->pos就是鼠标的位置
        if(rect.contains(event->pos()))
        {
            //标志设置成真
            this->m_flag = true;
            //获取相对坐标
            //这样可以保证移动过程中相对位置不变
            //移动的时候,鼠标位置加上m_point就是label的位置
            this->m_point = ui->label->pos() - event->pos();
        }
    }
}

void Drag::mouseReleaseEvent(QMouseEvent *event)
{
    //鼠标释放的操作就是不移动label了,把标识设置能false就可以了
    if(event->button() == Qt::LeftButton)
    {
        this->m_flag = false;
    }
}

void Drag::mouseMoveEvent(QMouseEvent *event)
{
    //鼠标移动就是鼠标到哪里控件就到哪里,然后加上相对路径就可以了
    //不过控件不能拖拽出父窗口,所以需要加以限制

    if(this->m_flag)
    {
        //控件移动的位置
        QPoint temp = event->pos() + this->m_point;
        //限制控件移动
        //小于相对位置,正常就是小于0嘛,多出去的就是相对位置鼠标Pos到控件pos嘛
        if(temp.x() < this->m_point.x())
        {
            //设置成相对位置
            temp.setX(this->m_point.x());
        }
        else if(temp.x() > this->size().width() + this->m_point.x())
        {
            temp.setX(this->size().width() + this->m_point.x());
        }

        if(temp.y() < this->m_point.y())
        {
            temp.setY(this->m_point.y());
        }
        else if(temp.y() > this->size().height() + this->m_point.y())
        {
            temp.setY(this->size().height() + this->m_point.y());
        }

        ui->label->move(temp);
    }
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值