一、前言
在Qt的图形视图框架中,QGraphicsScent提供了items() 来获取场景中的图元集合,提供了selectedItems() 来获取场景中被选中的图元集合,获取集合之后,通过qgraphicsitem_cast<>() 就可以将QGraphicsItem转换为相应的子类,例如:
if (isItemSelected(LineElementItem::Type)) {
LineElementItem* item = qgraphicsitem_cast<LineElementItem*>(selectedItems().first());
}
但是实际在使用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 来标识图元类别:
class QwtTextLabel : public QwtPlotItem
{
public:
QwtTextLabel();
virtual int rtti() const
{
return QwtPlotItem::Rtti_PlotUserItem + textLabel_item;
}
}
通过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
#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];
}
}
if(valueLine != nullptr) {
if(qAbs(mousePressed.x() - valueLine->ValueLine_Pos1.x()) <= 10) {
isSelected_valueLine = true;
}
}
}
|