Qt之利用事件過濾器在QLabel上畫框
阿新 • • 發佈:2021-02-20
、
第一:對目標物件呼叫installEventFilter()來註冊監視物件(事件過濾器);
第二:重寫監視物件的eventFilter()函式處理目標物件的事件。
1、在mainwindows中新增:
public:
bool eventFilter(QObject *watched, QEvent *event);
private:
bool mouseIsdown;
QPointF startPos;
QPointF endPos;
2、建構函式中安裝事件過濾器:
mouseIsdown= false;
ui->label->installEventFilter(this);
3、在 mainwindows.cpp中新增
#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