【问题标题】:QGraphicsscene: How to implement selection (by rubber band) behavior of QGraphicsItems?QGraphicsscene:如何实现 QGraphicsItems 的选择(通过橡皮筋)行为?
【发布时间】:2016-07-13 01:40:15
【问题描述】:

所以我知道这里有很多类似的问题,但没有一个真正达到我感兴趣的具体点。

我想实现 QGraphicsItems 的自定义选择行为(例如,在选择时更改其颜色)。显然这是由项目本身处理的,因此需要创建一个自己的类来扩展QGraphicsItem。在那里,我真的错过了一些东西,比如一个可以覆盖的onSelectionToggled 方法(插槽)。但我最终发现必须重写mousePressEvent 方法(毕竟“选择”只是左键抽象概念的更具体术语)。

所以如果在这个方法中我调用:

  setPen( QPen( QColor( "orange" ) ) );
  update();

当我单击单个项目时,颜色实际上会发生变化。 但当通过场景的橡皮筋进行选择时,则不然。 由于没有onSelectionToggled,我想象场景会“模拟”相交项目的相应鼠标事件。

既然情况并非如此,我的问题是:“我如何通过橡皮筋对这样的选择做出反应?”理想情况下以“统一”的方式(通过鼠标单击单独选择没有额外的代码)。

另外,我想知道如何防止在选择时绘制虚线边界矩形。我不想要它,并希望在子类化 QGraphicsItem 时自动摆脱它。

【问题讨论】:

  • 不是为了大问题,而是为了虚线矩形,恐怕你得重新实现QStyle::drawPrimitive...
  • @AlexisP。严重地?因为 QStyle 是一个具有许多派生类的抽象类,它们都可以在 QGraphicsScene::setStyle 中使用。对我来说,这看起来像是我必须对所有这些类进行子类化,覆盖 drawPrimitive 方法。或者我只选择 QStyle 的一个子类,但随后我失去了场景适应例如风格的能力。 KDE、Mac OS 或 Windows(据我所知,QStyle 实际上适用于这些)。

标签: qt selection qgraphicsitem qgraphicsscene


【解决方案1】:

QGraphicsItem 类是QGraphicsScene 中所有图形项的基类。 QGraphicsScene 类包含处理QGraphicsItem 选择的所有功能。如果您捕捉到信号QGraphicsScene::selectionChanged(),您应该能够通过

找到所选项目
`QList<QGraphicsItem *> QGraphicsScene::selectedItems()`

然后您可以更改这些项目的笔并重新绘制。

当然,既然您希望项目在取消选中后返回其原始颜色,也许更好的方法是遍历所有项目 (QList&lt;QGraphicsItem *&gt; QGraphicsScene::items()) 并检查它们的 isSelected() 状态以将它们的笔更改为合适的颜色。

【讨论】:

  • 感谢这个有用的答案。对所有项目进行迭代并检查它们是否被单独选择确实对我来说是正确的方法(因为我还想处理“取消选择”事件)。本着 MVC 模式的精神,我将代码放在一个控制器类中,该类具有指向 QGraphicsscne(作为模型)和 QGraphicsView(作为视图)的指针。仍然感觉有点尴尬,因为 Qt 文档明确告诉您在项目中实现动态行为……
猜你喜欢
  • 2019-09-05
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-15
  • 2017-07-30
相关资源
最近更新 更多