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
