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

2015-06-22_232008 只要你重写这些提供的虚函数,就可以捕获对应的消息,下面我们做了一些鼠标消息的小例子,借这些例子,你也可以覆写一些键盘等方面的消息处理虚函数。 【实现代码】 代码分三个文件,分别为(参考 使用 Qt 构建一个简单的窗体程序 ):

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

#include
#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
#include
#include

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…”;
}