Qt 窗口鼠标消息处理

在继承了 QWidget 窗口类以后,我们可以实现很多父类提供的虚函数,其中就包括鼠标的诸多消息处理函数,比如 mousePressEvent(鼠标单击消息)、mouseReleaseEvent(鼠标弹起消息)等等,这些虚函数我们可以通过 Qt 的帮助文档查看,如下:

2015-06-22_232008

只要你重写这些提供的虚函数,就可以捕获对应的消息,下面我们做了一些鼠标消息的小例子,借这些例子,你也可以覆写一些键盘等方面的消息处理虚函数。

【实现代码】

代码分三个文件,分别为(参考 使用 Qt 构建一个简单的窗体程序 ):

  • main.c:创建应用程序框架,调用 CWidget 窗口的入口函数。
  • CWidget.h:继承 QWidget 类。
  • CWidget.cpp:覆写鼠标等消息函数的实现
#include <QApplication>
#include "cwidget.h"

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);

    CWidget w;
    w.show();

    return app.exec();
}
#ifndef CWIDGET_H
#define CWIDGET_H

#include <QWidget>
#include <QMouseEvent>
#include <QDebug>

class CWidget : public QWidget
{
    Q_OBJECT
public:
    explicit CWidget(QWidget *parent = 0);

    // 鼠标按下消息
    void mousePressEvent(QMouseEvent *);
    // 鼠标松开消息
    void mouseReleaseEvent(QMouseEvent *);
    // 鼠标双击消息,有bug,会产生一次 mousePressEvent
    void mouseDoubleClickEvent(QMouseEvent *);
    // 鼠标移动消息,默认要在触发了mousePressEvent后才生效
    // 需要在构造函数中调用 this->setAttribute(Qt::WA_MouseTracking);
    void mouseMoveEvent(QMouseEvent *);

    // 鼠标进入窗口范围内消息
    void enterEvent(QEvent *);
    // 鼠标离开窗口范围内消息
    void leaveEvent(QEvent *);

signals:

public slots:
};

#endif // CWIDGET_H
#include "cwidget.h"

CWidget::CWidget(QWidget *parent) : QWidget(parent)
{
    this->setAttribute(Qt::WA_MouseTracking);
}

void CWidget::mousePressEvent(QMouseEvent *ev)
{
    // 鼠标左键单击
    if (ev->button() == Qt::LeftButton)
    {
        qDebug() << "left button down...";
    }
    // 鼠标右键单击
    else if (ev->button() == Qt::RightButton)
    {
        qDebug() << "right button down...";
    }

    // 判断是否按下了 alt 键
    if (ev->modifiers() == Qt::AltModifier)
    {
        qDebug() << "alt is down...";
    }
    // 判断是否按下了 CTRL 键
    if (ev->modifiers() == Qt::CTRL)
    {
        qDebug() << "ctrl is down...";
    }
}

void CWidget::mouseReleaseEvent(QMouseEvent *ev)
{
    // 鼠标左键单击弹起
    if (ev->button() == Qt::LeftButton)
    {
        qDebug() << "left button up...";
    }
    // 鼠标右键单击弹起
    else if (ev->button() == Qt::RightButton)
    {
        qDebug() << "right button up...";
    }
}

void CWidget::mouseDoubleClickEvent(QMouseEvent *)
{
    // 双击消息,会产生一次 mousePressEvent
    qDebug() << "doubleClick...";
}

void CWidget::mouseMoveEvent(QMouseEvent *)
{
    // 鼠标移动
    qDebug() << "mouse move...";
}

void CWidget::enterEvent(QEvent *)
{
    qDebug() << "mouse enter...";
}

void CWidget::leaveEvent(QEvent *)
{
    qDebug() << "mouse leave...";
}

 

发表评论