您的位置:首页 > 编程语言 > Qt开发

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

2017-01-01 08:44 741 查看
首先,感谢 作者:一去丶二三里 博客地址: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_OBJECT

public:
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=(QMouseE
8c61
vent *)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);

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  qt 事件过滤器