- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
与 Qt 中的其他原语一样,QGraphicsItems 可以处理鼠标事件等。甜的!现在说我需要将一个 QGraphicsItem 上的事件传播到同一场景中的其他一些 QGraphicsItem。我可以想到两种方法来解决这个问题:
(A) 天真的方法 - 信令
概念:将兄弟 QGraphicsItems 与信号连接在一起。 QGraphicsItem 上的事件处理程序调用 emit() 来唤起其他 QGraphicItem 上的协调响应。这遵循在整个 Qt 框架中建立的通用设计模式。
实现:由于我不完全理解的原因,QGraphicsItems 不能发出() 信号。 It has been suggested也从 QGraphicsObject 继承的派生类可能能够解决这个问题。不过,在我看来,在 QGraphicsItems 上排除 emit() 可能是 Qt 开发人员的有意设计决定,因此,多重继承可能不是正确的解决方案。
(B) 容器级事件处理
概念: QGraphicsItems 始终存在于 QGraphicsScene 类型的容器的上下文中。 (A) 中在 QGraphicsItem 级别处理的事件由继承自 QGraphicsScene 的对象处理。该对象还实现了在兄弟 QGraphicsItems 之间协调响应的逻辑。
实现: QGraphicsScene 绝对有能力处理否则会导致 QGraphicsItems 的事件。 QGraphicsScene 还提供了 itemsAt() 方法来确定其中的哪些东西受到位置事件的影响,比如鼠标点击。尽管如此,在容器类中为容器之间的协调 Action 构建相当多的逻辑感觉就像是未能正确封装。不好的做法?也许吧,但这似乎是它至少在 one official example 中的做法。 .
问题
最佳答案
信令不是 QGraphicItem 的一部分,因为它们不是从 QObjects 继承的。这是出于性能原因的设计决定,以允许非常大和快速的场景。如果您决定确实需要信号的特殊情况,则创建 QGraphicsWidget 来填补这一空白。它确实从 QObject 继承,并允许您混合使用 QWidget 和 QGraphicsItem 功能。尽管如果您的场景大小适中,建议您避免这种情况。
可能与您的情况相关的另一个选项是使用 sceneEventFilter 方法。您可以设置一个项目来接收另一个项目的事件,并决定是否应该传播它们:
http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qgraphicsitem.html#sceneEventFilter
可以将一项设置为多个对象的过滤器。并且它可以识别要响应的每个单独的项目和事件。
通常,尽管您应该利用场景来协调其对象。这已经是用于事件的模式(协调所有事件到项目的交付的场景)。
此外,您的选项 A 似乎是不可能的,因为 QGraphicsItem 甚至没有发射方法。您需要在其中组合一个 QObject 实例作为成员并使用它来发出信号。类似 myItem.qobject.emit()
的东西.否则,您将不得不从 QGraphicsObject 继承您自己的完全自定义的
更新 1 :解决您的主要评论更新
您的具体情况是一个带有“热角”的矩形。我会认为这是一个自定义的 QGraphicsItem。您可能会将 QGraphicsRectItem 子类化,然后将其中的子热角项组合为子项( setParentItem()
)。现在您的矩形项目知道它的子项并且可以直接对它们进行操作。您可以将矩形项设置为子项的 sceneEventFilter 并直接处理它们的事件。无需回到现场。让所有这些逻辑活在类里面。
更新 2 :解决您添加的问题 #3
将通信传播到场景之外的 QWidget 有几种我能想到的方法:
graphicsRect.resizedCallback
作为属性或 setter graphicsRect.setResizedCallback(cbk)
.在您的 rect 类中,您只需在适当的时候调用它。如果它设置了回调,它可用于直接调用场景中的某些内容。 rect 类仍然不知道该逻辑。它只是调用回调。 关于qt - Qt 的 QGraphicsItem : How is this *supposed* to work? 中的事件和信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10590881/
关闭。这个问题需要details or clarity .它目前不接受答案。 想要改进这个问题吗? 通过 editing this post 添加详细信息并澄清问题. 关闭去年。 Improve th
我是 Kotlin 的新手,我正在使用它。我非常想创建一个非常基本的事件总线。所以我想出了这个 interface Event interface EventListener { fun ha
我有这种带有 div 和链接的复杂设置。无论如何,当您将鼠标悬停在我页面左上角的 Logo 时,它应该会发生变化,而且确实如此。但是,如果您的鼠标移动到页面顶部的任何位置(图像上以红色标出),它也会发
我正在尝试使用 cvPerspectiveTransform 来转换四个 2D 点。我已经通过 cvFindHomography 获得了变换矩阵 (3x3)。我不知道要提供什么样的结构才不会遇到错误。
这是一个错误还是有文档表明不要在指令名称中使用后缀“start”?只有“完成”指令有效。 HTML: ... Angular doesn't like the suffix 'start'
我是 jQuery 新手,但只是尝试创建一个可用于过滤表的函数。我已经设置了表格,以便我可以按类选择所有行(效果很好)并在结果上调用each()。在每个()的回调中我有这个 if 语句: if ($(
苹果和橙子的问题。 12 个测试用例中只有 3 个被清除。几个小时后就想不出其他事情了。 示例输入0 7 11 5 15 3 2 -2 2 1 5 -6 示例输出 0 1 1 问题:https://w
我正在尝试在 Netbeans 中正确设置保存时部署(或保存时编译,或任何我应该设置的)。 我正在努力实现这一目标: 1) 如果结构没有改变,需要时热替换一些类(按下按钮,新代码替换旧代码) 2) 在
由 XCode 向导创建的主从项目包含 tableView:cellForRowAtIndexPath: 的实现,它调用 dequeueReusableCellWithIdentifier:forIn
Internet Explorer 9 无法正确显示绝对定位的元素。父级是相对的,所以绝对元素相对于父级div应该是“绝对”的。但是,它的行为更接近“固定”行为。当我尝试在相关元素上触发 hasLay
我对 WM_PAINT 有疑问。基本上我希望在用户 WM_COMMAND 之后调用 WM_PAINT,但由于某种原因它在主函数中仍然被调用。 case WM_PAINT: { cr
我正在尝试来自 Android 应用程序开发傻瓜 的示例,这是一个简单的应用程序,可以切换手机的铃声模式。代码如下。 public class SilentModeToggleActivity ext
根据广为流传的建议,我应该注意让我的大型软件项目尽可能模块化。当然有多种方法可以实现这一点,但我认为没有办法绕过使用更多或更少的接口(interface)类。 以使用 C++ 开发 2D 游戏引擎为例
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我在 Rails 3 应用程序中保存哈希时遇到问题。使用控制台时我可以保存它 - 当我通过表单提交哈希时它不起作用。 This SO question addresses它但解决方案对我不起作用。此外
在 CDA R2 CCD 实现指南中,ClinicalDocument 元素(文档的根元素)应该有一个 id 元素。 此 id 元素属于“II”数据类型:http://wiki.hl7.no/inde
我使用g++进行编译时没有任何选项,该程序可在1分钟左右运行。 但是,使用-O3进行编译会使它在大约1-2秒内运行。 我的问题是加快速度是否正常?还是我的代码可能太糟糕了,以至于优化可能会占用很多时间
我有一个基于 HTML 表单的调查问卷,我正试图将其放在一起。当我遇到 float 元素问题时,我已经使用 CCS 排列了所有 HTML 表单元素。 我有一个包含一些表单元素的 DIV,我想将它们放在
以下代码在 Clang 中编译良好并输出 int [3] 数组的大小 #include int main() { const int (&a)[] = { 1, 2, 3 }; std::c
我正在尝试运行以下代码: Cluster cluster = new Cluster(); cluster.add("localhost", port_number); Client client =
我是一名优秀的程序员,十分优秀!