Qt学习笔记(1)---QT5利用事件过滤器实现在控件上绘图
2017-01-01 08:44
741 查看
首先,感谢 作者:一去丶二三里 博客地址:http://blog.csdn.net/liang19890820
Qt中要在控件中绘制图像,需要重写paintevent函数,本文通过EventFilter(事件过滤器)来实现在控件上的图形绘制。
.h文件
eventFilter(QObject *watched, QEvent *event)中
watched为事件过滤器的对象即本文中的label , event 为事件类型。
其中需要注意的有两点:
1.在构造函数中添加过滤器installEventFilter(this)如果一个控件添加了多个过滤器,后添加会被选择执行。
2.返回父类的eventfliterreturn QWidget::eventFilter(watched,event);
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);
相关文章推荐
- Android 利用invalidate 函数与onDraw 事件来实现绘图动画
- Qt之Tab键实现(自由切换焦点)—— 采用事件过滤器处理
- 利用OFFICE 2003 OWC 绘图控件在.NET平台下实现数据图表的绘制
- 利用好CSS,实现Qt控件美化
- WPF利用委托与事件实现VM对View中控件的调用
- Qt控件注册事件过滤器后不显示
- qt利用委托:QStyledItemDelegate,实现tableview 的表格项的自定义显示,如插入图片,绘制控件
- 利用好CSS,实现Qt控件美化
- Qt常用控件+事件+基础绘图(四)
- 利用事件委托实现用户控件中的行为触发所在页面的处理函数
- ASP.NET基础教程-DataGrid表格控件-利用ItemDataBound事件实现鼠标移动到控件的某一行时改变该行的背景色
- Qt的事件模型(5种使用办法,通常重新实现event handler即可。只有定义控件才需要管理信号的发射)
- Android 利用invalidate 函数与onDraw 事件来实现绘图动画
- 深入浅出CChart 每日一课——快乐高四第十五课 罗马通途,利用ChartCtrl控件实现多区域绘图
- 示范如何让QT控件捕捉键盘事件实现…
- 利用MS的CAPICOM控件与Java结合实现B/S系统中的数字签名
- ASP中利用OWC控件实现图表功能详解
- 利用Java事件处理机制实现录制、回放功能
- 利用此事件对网格控件的外观进行控件(合并列)
- 利用js实现一个按钮可选择多个事件