Qt之利用事件过滤器在QLabel上画框

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

相关文章
相关标签/搜索