C++
不过最近编写一个小程序时代码里有个小
我的那个代码是个利用mouseMoveEvent事件。但是结果怎么也接收不到这个事件。下面是我的程序的一个简化版本。
//MyWidget.h#ifndef MW_H#define MW_H#include <QWidget>class MyWidget : public QWidget{Q_OBJECTpublic:MyWidget(QWidget *parent = 0);~MyWidget(); protected:void mousePressEvent( QMouseEvent * event ) ;void mouseReleaseEvent( QMouseEvent * event ) ;void mouseMoveEvent( QMoveEvent * event ) ;}; #endif//MyWidget.cpp#include "MyWidget.h"#include <QDebug>MyWidget::MyWidget(QWidget *parent):QWidget(parent){}MyWidget::~MyWidget(){}void MyWidget::mousePressEvent( QMouseEvent * event ) {Q_UNUSED(event);qDebug() << "mousePressEvent";}void MyWidget::mouseReleaseEvent( QMouseEvent * event ){Q_UNUSED(event);qDebug() << "mouseReleaseEvent";}void MyWidget::mouseMoveEvent( QMoveEvent * event ){Q_UNUSED(event);qDebug() << "mouseMoveEvent";}//main.cpp#include <QApplication>#include "MyWidget.h"int main(int argc, char **argv){QApplication app(argc, argv);MyWidget win;win.show();return app.exec();} 这个程序运行的结果如下:
我甚至一度认为我用的这个Qt版本出了bug。后来换了好几个Qt版本,甚至于到linux下还试了试,,结果都是一样的。折腾了好几天,最后发现是我把函数原型写错了。本应是:
voidmouseMoveEvent(QMouseEvent*event);
我错写为:
voidmouseMoveEvent(QMoveEvent*event);
而且刚巧Qt中有QMoveEvent这个类,所以这个代码编译时什么错误提示都没有。之所以这里会写错,是因为Qt中有另外一个事件,原型是:
voidmoveEvent(QMoveEvent*event);
最开始我错将这个事件当成鼠标移动事件了,后来发现还有个mouseMoveEvent就随手将函数名改过来了,但是没注意后面的参数类型是不同的,结果就悲剧了。
如果使用了override关键字,这种错误是很容易避免的。
//MyWidget.h#ifndef MW_H#define MW_H#include <QWidget>class MyWidget : public QWidget{Q_OBJECTpublic:MyWidget(QWidget *parent = 0);~MyWidget(); protected:void mousePressEvent( QMouseEvent * event ) override;void mouseReleaseEvent( QMouseEvent * event ) override;void mouseMoveEvent( QMoveEvent * event ) override;}; #endif
再次编译,就会提示
‘voidMyWidget::mouseMoveEvent(QMoveEvent*event)’markedoverride,butdoesnotoverride
不过override 关键字需要编译器支持 C++11。如果使用的是 gcc 编译器,需要加入命令行参数 -std=c++11
接受失败等于回归真实的自我,