通过向导创建了一个最普通的 MainWindow 程序,然后在 MainWindow 的构造函数中添加了一个子窗口:
- C/C++ code
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){ ui->setupUi(this); EditView* editView = new EditView(this); editView->move(QPoint(0, 0)); editView->resize(100, 100);}
EditView 的实现如下:
editview.h
- C/C++ code
#ifndef EDITVIEW_H#define EDITVIEW_H#include <QWidget>class EditView : public QWidget{ Q_OBJECTpublic: explicit EditView(QWidget *parent = 0); signals: public slots: protected: void mouseMoveEvent(QMouseEvent *event);};#endif // EDITVIEW_H
editview.cpp
- C/C++ code
#include "editview.h"#include <QtOpenGL/QGLWidget>EditView::EditView(QWidget *parent) : QWidget(parent){ // 在这里只要放入子窗口,鼠标不按住就无法响应到 mouseMoveEvent 事件,不放子窗口就可以响应,这是怎么回事? // 该如何解决? // QGLWidget *widget = new QGLWidget(QGLFormat(QGL::SampleBuffers), this); QWidget *widget = new QWidget(this); widget->resize(QSize(100, 100)); widget->move(0, 0); setMouseTracking(true);}void EditView::mouseMoveEvent(QMouseEvent *event){ setCursor(Qt::SizeBDiagCursor);}
鼠标没有按住,移动到 EditView 的子窗口上时不能响应到 mouseMoveEvent() 事件,这是怎么回事,该如何解决?
------解决方案--------------------
哦。。没仔细看。
你在EditView里面放了一个子控件,事件会先发送给子控件处理的。所以没进EditView的mouseMoveEvent。
如果子控件是必须的,那就重载子控件的mouseMoveEvent做处理,
或者用eventFilter,交给EditView处理。