在继承了 QWidget 窗口类以后,我们可以实现很多父类提供的虚函数,其中就包括鼠标的诸多消息处理函数,比如 mousePressEvent(鼠标单击消息)、mouseReleaseEvent(鼠标弹起消息)等等,这些虚函数我们可以通过 Qt 的帮助文档查看,如下:
只要你重写这些提供的虚函数,就可以捕获对应的消息,下面我们做了一些鼠标消息的小例子,借这些例子,你也可以覆写一些键盘等方面的消息处理虚函数。
【实现代码】
代码分三个文件,分别为(参考 使用 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..."; }