QGraphicsScene中选择QGraphicsLineItem的问题

LiuZnHi 2013-12-19 04:05:54
最近在学习QGraphicsScene和QGraphicsLineItem,在QGraphicsScene有个函数itemAt(QPoint p),可以根据坐标来获取该点是否有QGraphicsItem,目前的情况是:如果一个点包含QGraphicsItem,那就可以获取到这个item,如果换成QGraphicsLineItem,就无法获取到该item,QGraphicsLineItem是QGraphicsItem的子类,不知道是否有高手来给帮忙解决这个问题。
...全文
732 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
LiuZnHi 2013-12-23
  • 打赏
  • 举报
回复
引用 6 楼 davidsu33 的回复:
这些代码还是不好帮你分析,我感觉可能的问题有如下两个 1.是否你的图形图元显示了 2.是否你的图形的boundingRect()正确返回了
谢谢你的回答,这个问题我解决了,通过跟踪发现,在设置图形时,没有给QGraphicsLineItem设置setline,导致没有实体,我使用了QGraphicsLineItem的selectItem函数来获取点击到的item,,谢谢你的帮助!
davidsu33 2013-12-21
  • 打赏
  • 举报
回复
这些代码还是不好帮你分析,我感觉可能的问题有如下两个 1.是否你的图形图元显示了 2.是否你的图形的boundingRect()正确返回了
LiuZnHi 2013-12-20
  • 打赏
  • 举报
回复
引用 4 楼 davidsu33 的回复:
我测试了一下没有问题,这样你把你的代码贴出来看看
QGraphicsItem *item = itemAt(pt); if (isOSConnecting()) { m_line->setVisible(true); } if (item != 0) { m_curItem = (GraphElementItem *)item; showItemHotSpots(m_curItem, true); } else { showItemHotSpots(m_curItem, false); m_curItem = 0; } 这一部分就是获取item的代码,是在mouseMoveEvent中的, 我自己自定义了一个类:ConnectorItem,它继承了QGraphicsLineItem,就是获取不到这个item。下面这个类定义,不知道哪地方出问题了。。 lass QPainter; class QGraphicsLineItem; class ConnectorItem : public QGraphicsLineItem { public: enum { Type = UserType + 2 }; ConnectorItem(GraphElementItem *outGE, GraphElementItem *inGE, QGraphicsItem *parent = 0, ProgramScene *scene = 0); virtual ~ConnectorItem(); int type() const { return Type; } QRectF boundingRect() const; QPainterPath shape() const; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); enum { LineOut_Length = 20, // pixel LineIn_Length = 20, GE_Gap = 10, }; private: void drawRightOutLine(QPainter *, QPointF, QPointF, QPointF, QPointF); void drawBottomOutLine(QPainter *, QPointF, QPointF, QPointF, QPointF); void drawLeftInLine(QPainter *, QPointF, QPointF, QPointF, QPointF); void drawTopInLine(QPainter *, QPointF, QPointF, QPointF, QPointF); void RightToTop(QPainter *, QPointF, QPointF, QPointF, QPointF); void RightToLeft(QPainter *, QPointF, QPointF, QPointF, QPointF); void BottomToTop(QPainter *, QPointF, QPointF, QPointF, QPointF); void BottomToLeft(QPainter *, QPointF, QPointF, QPointF, QPointF); void drawLines(QPainter *); QLineF m_lineOut; QLineF m_lineOutPro; QLineF m_lineConnect; QLineF m_lineInPro; QLineF m_lineIn; QLineF m_lineArrow1; QLineF m_lineArrow2; QVector<QPointF> m_pts; QColor m_color; GraphElementItem::HotSpot m_hotSpotOut; GraphElementItem::HotSpot m_hotSpotIn; ProgramScene *m_scene; GraphElementItem *m_outGE; GraphElementItem *m_inGE; };
davidsu33 2013-12-19
  • 打赏
  • 举报
回复
我测试了一下没有问题,这样你把你的代码贴出来看看
LiuZnHi 2013-12-19
  • 打赏
  • 举报
回复
引用 2 楼 davidsu33 的回复:
有两个可能 1.QGraphicsLineItem的Z没有放到最前 2.QGraphicsLineItem的线条细,没有达到选中条件
第一个可能不存在 第二个可能,我把线宽弄粗了,还是不行。。。不知道是否还有其他方法?
davidsu33 2013-12-19
  • 打赏
  • 举报
回复
有两个可能 1.QGraphicsLineItem的Z没有放到最前 2.QGraphicsLineItem的线条细,没有达到选中条件
LiuZnHi 2013-12-19
  • 打赏
  • 举报
回复
咋木有人回啊!自己顶一下!
Qt 场景、视图、项应用实例,Qt整套源码,喜欢请下载: Link: #include GraphicsLineItem> class Node; class Link : public QGraphicsLineItem { public: Link(Node *formN, Node *toN); ~Link(); inline Node *formNode()const { return myFormNode; } inline Node *toNode() const { return myToNode; } void setColor(const QColor &c); QColor color()const; void trackNodes(); private: Node *myFormNode; Node *myToNode; }; Node: #ifndef NODE_H #define NODE_H #include GraphicsItem> #include class Link; class Node : public QGraphicsItem { public: Node(); ~Node(); inline void setText(const QString &text;); inline QString text()const {return myText;} inline void setTextColor(const QColor &c) { myTextColor = c; update();} inline QColor textColor()const{return myTextColor;} inline void setBackgroundColor(const QColor &c) { myBackgroundColor = c; update();} inline QColor backgroundColor()const{return myBackgroundColor;} inline void setOutLineColor(const QColor &c) { myOutLineColor = c; update();} inline QColor outLineColor()const{return myOutLineColor;} void addLink(Link *l); void removeLink(Link *l); QRectF boundingRect()const Q_DECL_OVERRIDE; QPainterPath shape() const Q_DECL_OVERRIDE; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = Q_NULLPTR) Q_DECL_OVERRIDE; protected: void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) Q_DECL_OVERRIDE; QVariant itemChange(GraphicsItemChange change, const QVariant &value;) Q_DECL_OVERRIDE; private: QRectF outlineRect()const; int roundness(double size)const;//计算圆角 QSet<Link *> myLinks; QString myText; QColor myTextColor; QColor myBackgroundColor; QColor myOutLineColor; }; #endif // NODE_H View: #ifndef GRAPHICSVIEW_H #define GRAPHICSVIEW_H #include #include GraphicsView> #include <QGraphicsScene> class GraphicsView : public QGraphicsView { Q_OBJECT public: explicit GraphicsView(QGraphicsScene *scene, QWidget *parent = 0); protected: void wheelEvent(QWheelEvent *e); }; #endif // GRAPHICSVIEW_H

16,233

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧