首先,感谢 作者:一去丶二三里 博客地址: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=(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);