Qt学习笔记(1)---QT5利用事件过滤器实现在控件上绘图

来源:互联网 发布:2016年网络流行词汇 编辑:程序博客网 时间:2024/06/05 19:32

首先,感谢 作者:一去丶二三里 博客地址:http://blog.csdn.net/liang19890820  


Qt中要在控件中绘制图像,需要重写paintevent函数,本文通过EventFilter(事件过滤器)来实现在控件上的图形绘制。

.h文件

#ifndef WIDGET_H#define WIDGET_H#include <QWidget>#include <QPointF>namespace Ui {class Widget;}class Widget : public QWidget{    Q_OBJECTpublic:    explicit Widget(QWidget *parent = 0);    ~Widget();public slots:    bool eventFilter(QObject *, QEvent *);private:    Ui::Widget *ui;    bool mouseIsdown;    QPointF startPos;    QPointF endPos;};#endif // WIDGET_H
.cpp文件

#include "widget.h"#include "ui_widget.h"#include <QPainter>#include <QMouseEvent>Widget::Widget(QWidget *parent) :    QWidget(parent),    ui(new Ui::Widget){    ui->setupUi(this);    mouseIsdown = false;    ui->label->installEventFilter(this);}Widget::~Widget(){    delete ui;}bool Widget::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)        {            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);            // 绘制直线            painter.drawLine(startPos, endPos);        }    }    return QWidget::eventFilter(watched,event);}

eventFilter(QObject *watched, QEvent *event)中

watched为事件过滤器的对象即本文中的label , event 为事件类型。

其中需要注意的有两点:

1.在构造函数中添加过滤器installEventFilter(this)如果一个控件添加了多个过滤器,后添加会被选择执行。

2.返回父类的eventfliterreturn QWidget::eventFilter(watched,event);



0 0