鼠标触发事件



头文件
#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组件 */

  1. // .h头文件   
  2. #ifndef MOUSEDIALOG_H  
  3. #define MOUSEDIALOG_H  
  4. #include <QDialog>  
  5. #include <QMouseEvent> // 鼠标事件  
  6. namespace Ui {  
  7. class MouseDialog;  
  8. }  
  9. class MouseDialog : public QDialog  
  10. {  
  11.     Q_OBJECT  
  12. public:  
  13.     explicit MouseDialog(QWidget *parent = 0);  
  14.     ~MouseDialog();  
  15. private:  
  16.     void mousePressEvent (QMouseEvent* event);  // 鼠标按下  
  17.     void mouseReleaseEvent (QMouseEvent* event);  // 鼠标抬起  
  18.     void mouseMoveEvent (QMouseEvent* enevt); // 鼠标移动  
  19. private:  
  20.     Ui::MouseDialog *ui;  
  21. private:  
  22.     bool m_bDrag; // 标记鼠标是否是左键选中lable  
  23.     QPoint m_ptPos; // 记录鼠标和label相对位置  
  24. };  
  25. #endif // MOUSEDIALOG_H  
// .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

  1. // .cpp   
  2. #include "MouseDialog.h"  
  3. #include "ui_MouseDialog.h"  
  4. MouseDialog::MouseDialog(QWidget *parent) :  
  5.     QDialog(parent),  
  6.     ui(new Ui::MouseDialog) {  
  7.     ui->setupUi(this);  
  8. }  
  9. MouseDialog::~MouseDialog() {  
  10.     delete ui;  
  11. }  
  12. void MouseDialog::mousePressEvent (QMouseEvent* event) {  
  13.     // 判断是否是左键按下  
  14.     if (event->button () == Qt::LeftButton) {  
  15.         // 获取label矩形区域  
  16.         QRect rcBlock = ui->label->frameRect ();  
  17.         // 平移,保证鼠标和矩形区域坐标系一致  
  18.         rcBlock.translate (ui->label->pos ());  
  19.         // 判断点击的位置是否在rcBlock之内  
  20.         if (rcBlock.contains (event->pos ()) == true) {  
  21.             m_bDrag = true;  
  22.             m_ptPos = ui->label->pos () - event->pos (); // QPoint  
  23.         }  
  24.     }  
  25. }  
  26. void MouseDialog::mouseReleaseEvent (QMouseEvent* event) {  
  27.     // 判断是否是左键抬起  
  28.     if (event->button () == Qt::LeftButton) {  
  29.         m_bDrag = false;  
  30.     }  
  31. }  
  32. void MouseDialog::mouseMoveEvent (QMouseEvent* event) {  
  33.     if (m_bDrag) {  
  34.         // 计算新的坐标位置  
  35.         QPoint ptPos = m_ptPos + event->pos ();  
  36.         // 设置label移动的边界区域限制  
  37.         // 获取父窗口大小  
  38.         QSize szClient = size ();  
  39.         // 获取label的矩形区域 == 大小  
  40.         // QRect rcBlock = ui->label->frameRect (); 此行无用  
  41.         // x:0 (窗口.宽度 - label.宽度)  
  42.         if (ptPos.x () < 0) {  
  43.             ptPos.setX (0);  
  44.         } else  
  45.         if (ptPos.x () > szClient.width () - ui->label->width ()) {  
  46.             ptPos.setX (szClient.width () - ui->label->width ());  
  47.         }  
  48.         // y:0 (窗口.高度 - label.高度)  
  49.         if (ptPos.y () < 0) {  
  50.             ptPos.setY (0);  
  51.         } else  
  52.         if (ptPos.y () > szClient.height () - ui->label->height ()) {  
  53.             ptPos.setY (szClient.height () - ui->label->height ());  
  54.         }  
  55.         // 移动label到新的位置  
  56.         ui->label->move (ptPos);  
  57.     }  
  58. }  
// .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);
    }
}

  1. // main.cpp  
  2. #include "MouseDialog.h"  
  3. #include <QApplication>  
  4. int main(int argc, char *argv[])  
  5. {  
  6.     QApplication a(argc, argv);  
  7.     MouseDialog w;  
  8.     w.show();  
  9.     return a.exec();  
  10. }   
// main.cpp
#include "MouseDialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MouseDialog w;
    w.show();
    return a.exec();
} 


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值