• 详解Qt中的鼠标事件


    在这里插入图片描述

    在Qt中,处理鼠标事件是构建交互式界面的关键。Qt提供了一系列与鼠标相关的事件处理函数,允许开发者捕获鼠标的各种动作,如按下、释放、移动、双击等。以下是鼠标事件的使用方法、技巧以及注意事项,并附带C++代码示例。

    基础使用方法

    1. 重写事件处理函数:在自定义的QWidget或其子类中,重写鼠标相关事件处理函数。

    2. 事件过滤器:也可以通过安装事件过滤器来全局或针对特定对象捕获鼠标事件。

    常用鼠标事件处理函数

    • 鼠标按下void mousePressEvent(QMouseEvent *event)
      当用户按下鼠标键时触发。

    • 鼠标释放void mouseReleaseEvent(QMouseEvent *event)
      当用户释放鼠标键时触发。

    • 鼠标移动void mouseMoveEvent(QMouseEvent *event)
      当鼠标指针在控件范围内移动时触发。

    • 鼠标双击void mouseDoubleClickEvent(QMouseEvent *event)
      当用户双击鼠标键时触发。

    • 鼠标进入与离开
      void enterEvent(QEvent *) - 鼠标进入控件区域。
      void leaveEvent(QEvent *) - 鼠标离开控件区域。

    技巧与注意事项

    1. 事件传播与忽略:可以通过event->ignore()阻止事件进一步传递,或通过accept()告知系统事件已被处理。

    2. 坐标转换:使用QMouseEvent的坐标时,注意pos()返回的是相对于控件自身的坐标,而globalPos()返回的是屏幕坐标。

    3. 按钮判断:通过QMouseEvent::button()判断按下的是哪个鼠标键(如Qt::LeftButtonQt::RightButton等)。

    4. 鼠标追踪:通过setMouseTracking(bool enable)方法,可以启用或禁用鼠标追踪。启用后,即使鼠标没有按下也会不断触发mouseMoveEvent

    5. 自定义委托:在使用QTableViewQListWidget等时,可通过自定义委托(QItemDelegateQStyledItemDelegate)来处理单元格级别的鼠标事件。

    C++代码示例

    #include 
    #include 
    #include 
    #include 
    
    class MouseExample : public QWidget {
        Q_OBJECT
    public:
        MouseExample(QWidget *parent = nullptr) : QWidget(parent) {}
    
    protected:
        void mousePressEvent(QMouseEvent *event) override {
            qDebug() << "Mouse pressed at:" << event->pos();
        }
    
        void mouseReleaseEvent(QMouseEvent *event) override {
            qDebug() << "Mouse released at:" << event->pos();
        }
    
        void mouseMoveEvent(QMouseEvent *event) override {
            qDebug() << "Mouse moved at:" << event->pos();
        }
    
        void mouseDoubleClickEvent(QMouseEvent *event) override {
            if (event->button() == Qt::LeftButton) {
                qDebug() << "Double click detected!";
            }
        }
    
        void enterEvent(QEvent * event) override{
            qDebug()<<__LINE__<<__FUNCTION__<<event->type();
        }
        void leaveEvent(QEvent * event) override{
            qDebug()<<__LINE__<<__FUNCTION__<<event->type();
        }
    };
    
    int main(int argc, char *argv[]) {
        QApplication app(argc, argv);
        MouseExample example;
        example.show();
        return app.exec();
    }
    
    #include "main.moc"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    这段代码定义了一个MouseExample类,重写了几个鼠标事件处理函数,用于输出鼠标在控件上的动作信息。通过运行这个例子,你可以在控制台看到鼠标按下、释放、移动和双击的坐标信息。

  • 相关阅读:
    MySQL数据库期末考试试题及参考答案(07)
    几块钱和几十块的牙膏有什么区别?贵的就是好的?一文告诉你
    AcWing 2811. 最长公共子串(后缀自动机 fa 指针的性质)
    uniapp vue 页面传参问题encodeURIComponent
    金仓数据库 KingbaseES PL/SQL 过程语言参考手册(7. PL/SQL 静态 SQL)
    计算机毕业设计ssm+vue基本微信小程序的好物推荐分享系统
    Generalized Focal Loss v2 原理与代码解析
    Java 高频疑难问题系列一
    taobao开放平台【接口调用方式介绍及返回数据结构】
    Vue中的样式绑定
  • 原文地址:https://blog.csdn.net/oThink1/article/details/138200863