、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