日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

QWT--选取图元

發布時間:2023/12/14 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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來標識圖元類別:

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 // 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;}} }

總結

以上是生活随笔為你收集整理的QWT--选取图元的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。