、windows
第一:对目标对象调用installEventFilter()来注册监视对象(事件过滤器);
第二:重写监视对象的eventFilter()函数处理目标对象的事件。函数
一、在mainwindows中添加:ui
public: bool eventFilter(QObject *watched, QEvent *event); private: bool mouseIsdown; QPointF startPos; QPointF endPos;
二、构造函数中安装事件过滤器:this
mouseIsdown = false;
ui->label->installEventFilter(this);
三、在 mainwindows.cpp中添加spa
#include <QPainter> #include <QMouseEvent> bool MainWindow::eventFilter(QObject *watched, QEvent *event) { if(watched == ui->label ) { if(event->type() == QEvent::MouseButtonPress) { QMouseEvent *mouseEvent = (QMouseEvent *)event; if(mouseEvent->buttons()&Qt::LeftButton) { mouseIsdown = true; startPos = mouseEvent->pos(); } } if(event->type() == QEvent::MouseMove) { QMouseEvent *mouseEvent=(QMouseEvent *)event; if(mouseIsdown) { endPos = mouseEvent->pos(); ui->label->update(); } } if(event->type() == QEvent::MouseButtonRelease) { QMouseEvent *mouseEvent=(QMouseEvent *)event; endPos = mouseEvent->pos(); mouseIsdown = false; } if(event->type() == QEvent::Paint) { magicTime(); QPainter painter(ui->label); QPen pen = painter.pen(); pen.setWidth(3); pen.setColor(QColor(173, 255, 47)); painter.setRenderHint(QPainter::Antialiasing, true); painter.setPen(pen); QRect rect(startPos.x(),startPos.y(),endPos.x(), endPos.y()); painter.drawRect(rect); } } return QMainWindow::eventFilter(watched, event); //将事件传递给父类 }
参考:https://blog.csdn.net/qq_31607215/article/details/53964594.net