QT:鼠标事件

鼠标事件

1. 鼠标手册
#include <QMousEvent >
// 鼠标按下
QWidget::mousePressEvent(QMouseEvent * event) [virtual];
// 鼠标释放-抬起
QWidget::mouseReleaseEvent(QMouseEvent * event) [virtual];
// 鼠标移动
QWidget::mouseMoveEvent(QMouseEvent * event) [virtual];
// 鼠标双击
QWidget::mouseDoubleClickEvent(QMouseEvent * event) [virtual];

button (); // 获取当前鼠标按键
if ( event->button () == Qt::LeftButton) {
}
Qt::LeftButton  // 左键
Qt::RightButton // 右键
Qt::MidButton   // 中键

《案例》用鼠标拖拽lab组件
工程名:Mouse
类名:MouseDialog

/* 代码演示 - 使用鼠标拖拽lab组件 */

// .h头文件 
#ifndef MOUSEDIALOG_H
#define MOUSEDIALOG_H
#include <QDialog>
#include <QMouseEvent> // 鼠标事件
namespace Ui {
class MouseDialog;
}
class MouseDialog : public QDialog
{
    Q_OBJECT
public:
    explicit MouseDialog(QWidget *parent = 0);
    ~MouseDialog();
private:
    void mousePressEvent (QMouseEvent* event);  // 鼠标按下
    void mouseReleaseEvent (QMouseEvent* event);  // 鼠标抬起
    void mouseMoveEvent (QMouseEvent* enevt); // 鼠标移动
private:
    Ui::MouseDialog *ui;
private:
    bool m_bDrag; // 标记鼠标是否是左键选中lable
    QPoint m_ptPos; // 记录鼠标和label相对位置
};
#endif // MOUSEDIALOG_H

// .cpp 
#include "MouseDialog.h"
#include "ui_MouseDialog.h"
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 ();
        // 平移,保证鼠标和矩形区域坐标系一致
        rcBlock.translate (ui->label->pos ());
        // 判断点击的位置是否在rcBlock之内
        if (rcBlock.contains (event->pos ()) == true) {
            m_bDrag = true;
            m_ptPos = ui->label->pos () - event->pos (); // QPoint
        }
    }
}
void MouseDialog::mouseReleaseEvent (QMouseEvent* event) {
    // 判断是否是左键抬起
    if (event->button () == Qt::LeftButton) {
        m_bDrag = false;
    }
}
void MouseDialog::mouseMoveEvent (QMouseEvent* event) {
    if (m_bDrag) {
        // 计算新的坐标位置
        QPoint ptPos = m_ptPos + event->pos ();
        // 设置label移动的边界区域限制
        // 获取父窗口大小
        QSize szClient = size ();
        // 获取label的矩形区域 == 大小
        // QRect rcBlock = ui->label->frameRect (); 此行无用
        // x:0 (窗口.宽度 - label.宽度)
        if (ptPos.x () < 0) {
            ptPos.setX (0);
        } else
        if (ptPos.x () > szClient.width () - ui->label->width ()) {
            ptPos.setX (szClient.width () - ui->label->width ());
        }
        // y:0 (窗口.高度 - label.高度)
        if (ptPos.y () < 0) {
            ptPos.setY (0);
        } else
        if (ptPos.y () > szClient.height () - ui->label->height ()) {
            ptPos.setY (szClient.height () - ui->label->height ());
        }
        // 移动label到新的位置
        ui->label->move (ptPos);
    }
}

// main.cpp
#include "MouseDialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MouseDialog w;
    w.show();
    return a.exec();
} 


《案例》用鼠标拖拽lab组件 - 【总结】
    void mousePressEvent (QMouseEvent* event);  // 鼠标按下
    void mouseReleaseEvent (QMouseEvent* event); // 鼠标抬起
    void mouseMoveEvent (QMouseEvent* enevt); // 鼠标移动
 // 判断是否是左键按下
    if (event->button () == Qt::LeftButton) { ... }
 // 判断点击的位置是否在rcBlock之内
    if (rcBlock.contains (event->pos ()) == true) { 

<tips>
调试程序使用词句,查看函数调用情况:
 qDebug ("%s", __func__); // 测试函数调用

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姜源Jerry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值