【QT】利用QT写一个鼠标事件的例子 鼠标拖动方格子 以及坐标转换

利用QT写一个鼠标事件的例子  鼠标拖动方格子 以及坐标转换

新建一个带ui的项目

1.ui界面

2.添加头文件

#include <QDialog>
#include <QMouseEvent>

3.添加函数及变量声明

private:
    void mousePressEvent(QMouseEvent *);
    void mouseReleaseEvent(QMouseEvent *);
    void mouseMoveEvent(QMouseEvent *);
private:
    Ui::MouseDialog *ui;
    bool m_bDrag;//判断是否是左键选中
    QPoint m_ptPos;//记录鼠标和label相对位置

4.添加.cpp函数

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

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

void MouseDialog::mousePressEvent(QMouseEvent *event){
    if(event->button() == Qt::LeftButton){
        //获取label矩形区域
        QRect rcBlock = ui->label->frameRect();
        //平移,让rcBlck和窗口坐标系一致
        rcBlock.translate(ui->label->pos());
        //判断鼠标点击的坐标是否在label区域内
        if(rcBlock.contains(event->pos()) == true){
            m_bDrag = true;
            //计算相对偏移量
            m_ptPos = ui->label->pos()-event->pos();
        }
    }
}
void MouseDialog::mouseReleaseEvent(QMouseEvent *event){
    if(event->button() == Qt::LeftButton){
        m_bDrag = false;
    }
}
void MouseDialog::mouseMoveEvent(QMouseEvent *event){
    if(m_bDrag){
        //计算新坐标
        QPoint ptPos = event->pos() + m_ptPos;
        //获取窗口大小
        QSize szClient = size();
        //获取label位置
        QRect rcBlock = ui->label->frameRect();
        //x坐标范围(0--(窗口x-label宽度))
        if(ptPos.x() < 0)
            ptPos.setX(0);
        else if(ptPos.x() >
                szClient.width()-rcBlock.width()){
            ptPos.setX(szClient.width()-rcBlock.width());
        }
        //y坐标范围(0--(窗口y-label高度))
        if(ptPos.y() < 0)
            ptPos.setY(0);
        else if(ptPos.y() >
                szClient.height()-rcBlock.height()){
            ptPos.setY(szClient.height()-rcBlock.height());
        }

        //移动到新的位置
        ui->label->move(ptPos);
    }
}

5.运行

发布了201 篇原创文章 · 获赞 46 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/rong11417/article/details/104475786