1. 程式人生 > 其它 >Qt之利用事件過濾器在QLabel上畫框

Qt之利用事件過濾器在QLabel上畫框

技術標籤:過濾器javaeventvueandroid

ac840771d75814fd26a587515f83f5fd846.jpg

第一:對目標物件呼叫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