QWT--选取图元
一、前言
在Qt的圖形視圖框架中,QGraphicsScent提供了items()來獲取場景中的圖元集合,提供了selectedItems()來獲取場景中被選中的圖元集合,獲取集合之后,通過qgraphicsitem_cast<>()就可以將QGraphicsItem轉換為相應的子類,例如:
if (isItemSelected(LineElementItem::Type)) {LineElementItem* item = qgraphicsitem_cast<LineElementItem*>(selectedItems().first());//操作item }但是實際在使用QWT時,并沒有這么多的API來供開發者使用。
二、具體流程
1、定義圖元標識
在QGraphicsItem中,采用Type來標識圖元類別:
class TextItem : public QGraphicsTextItem {Q_OBJECT public:enum { Type = UserType + TYPE_TEXT };TextItem(QGraphicsItem* parent = 0);int type() const{return Type;} };而在QWT中,則采用rtti來標識圖元類別:
通過QWT源碼可知,QwtPlotItem將QwtPlotItem::Rtti_PlotUserItem(枚舉值為100)之后的用于用戶自定義圖元標識,所以我們只需要在這個基礎上定義自己的圖元標識即可;
自定義QWT圖元類
#ifndef QWTVALUELINE_H #define QWTVALUELINE_H#include <qwt_plot_item.h> #include <qwt_painter.h>#include "DataDefine.h"class QPainter; class QPen; class QFont; class QwtScaleMap; class QwtScaleDiv;class QwtValueLine : public QwtPlotItem { public:QwtValueLine();QPointF ValueLine_Pos1;QPointF ValueLine_Pos2;QColor ValueLine_Color;virtual int rtti() const; //指定當前圖元項代表的意義virtual void draw( QPainter *p,const QwtScaleMap &xMap, const QwtScaleMap &yMap,const QRectF &rect ) const; //自定義圖元項繪制函數void set_ValueLine_Pos1(QPointF);void set_ValueLine_Pos2(QPointF);void set_ValueLine_Color(QColor); };#endif // QWTVALUELINE_H #include "qwtvalueline.h"QwtValueLine::QwtValueLine() {ValueLine_Pos1 = QPointF(-1,-1);ValueLine_Pos2 = QPointF(-1,-1);ValueLine_Color = QColor(255,0,0); }int QwtValueLine::rtti() const //虛函數,指定當前圖元項代表的意義 {return QwtPlotItem::Rtti_PlotUserItem + valueLine_item; } void QwtValueLine::draw( QPainter *p,const QwtScaleMap &xMap, const QwtScaleMap &yMap,const QRectF &rect ) const //純虛函數,自定義圖元項繪制函數 {p->setRenderHints(QPainter::Antialiasing, true); //設置反鋸齒p->setPen(QPen(ValueLine_Color,3));QwtPainter::drawLine(p,ValueLine_Pos1,ValueLine_Pos2); }void QwtValueLine::set_ValueLine_Pos1(QPointF pos1) {this->ValueLine_Pos1 = pos1;this->itemChanged(); } void QwtValueLine::set_ValueLine_Pos2(QPointF pos2) {this->ValueLine_Pos2 = pos2;this->itemChanged(); } void QwtValueLine::set_ValueLine_Color(QColor color) {this->ValueLine_Color = color;this->itemChanged(); }2、獲取指定圖元
QWT提供了itemList()來獲取場景中的圖元集合
void PlotView::mousePressEvent(QMouseEvent *event) {mousePressed = event->pos(); //物理坐標isSelected_valueLine = false;for(int i=0; i<this->itemList().size(); ++i) {if(this->itemList().at(i)->rtti() == QwtPlotItem::Rtti_PlotUserItem + valueLine_item) {valueLine = (QwtValueLine*)this->itemList()[i]; //將QwtPlotItem類轉換為自定義圖元類QwtValueLine//valueLine = dynamic_cast<QwtValueLine*>(this->itemList()[i]);}}if(valueLine != nullptr) {if(qAbs(mousePressed.x() - valueLine->ValueLine_Pos1.x()) <= 10) {isSelected_valueLine = true;}} }總結
- 上一篇: 05 反向传播
- 下一篇: 17款好用的跨浏览器测试神器,兼容性测试