为啥 itemAt() 并不总能找到 QGraphicsItem

Posted

技术标签:

【中文标题】为啥 itemAt() 并不总能找到 QGraphicsItem【英文标题】:Why does itemAt() not always find QGraphicsItem为什么 itemAt() 并不总能找到 QGraphicsItem 【发布时间】:2013-10-21 04:50:44 【问题描述】:

考虑这个非常简单的例子,你可以在 QGraphicsScene 周围拖动一个正方形(使用 PyQt,C++ 用户将 self 读作 this

import sys
from PyQt4 import QtGui, QtCore

class MainWindowUi(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.scene = Scene(0, 0, 300, 300, self)
        self.view = QtGui.QGraphicsView()
        self.setCentralWidget(self.view)
        self.view.setScene(self.scene)
        self.scene.addItem(Square(0,0,50,50))

class Scene(QtGui.QGraphicsScene):

    def mousePressEvent(self, e):
        self.currentItem = self.itemAt(e.pos())
        print (self.currentItem)
        QtGui.QGraphicsScene.mousePressEvent(self, e)

class Square(QtGui.QGraphicsRectItem):
    def __init__(self, *args):
        QtGui.QGraphicsRectItem.__init__(self, *args)
        self.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True)
        self.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, True)

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    win = MainWindowUi()
    win.show()
    sys.exit(app.exec_())

当您在场景中单击鼠标时,您应该会看到一条打印语句,告诉您您单击了正方形还是未单击任何内容(即无)。如果您只是启动程序并单击方块,则此方法有效。

现在将方块拖离左上角并再次单击它。这一次 itemAt() 甚至在你点击方块时也返回 None。

发生了什么事?

【问题讨论】:

检查 item 上的 sceneBoundingRect() 是否返回合理值 在 Square 实例上调用 sceneBoundingRect() 的结果会产生一个合理的结果。但是,这样做我意识到,只要 Square 的位置不同于 (0,0),就会发生我原始帖子中描述的失败。这是一些有趣的事情与场景没有得到广场有关,因为广场在场景的边界矩形之外?这会让我感到惊讶,因为我制作了 300x300 的场景...... 【参考方案1】:

答案似乎是我应该使用self.itemAt(e.scenePos()) 而不是self.itemAt(e.pos())。我在this SO question 找到了这个。

我在这里注意到,我一直无法找到有关此问题的信息的原因是在 QGraphicsScene 中移动 QGraphicsItems 不是 Qt 所谓的“拖放”。要搜索有关此主题的信息,您需要搜索“move QGraphicsItem”之类的内容。

【讨论】:

以上是关于为啥 itemAt() 并不总能找到 QGraphicsItem的主要内容,如果未能解决你的问题,请参考以下文章

QTableWidget::itemAt() 返回看似随机的项目

QTableWidgetItem.itemAt(pos) 在 contextMenu 请求时总是返回 0

QML:在中继器上调用 itemAt 返回 null

我可以确定重新分配更少的内存总能找到足够的内存吗?

为啥贪心硬币找零算法对某些硬币组不起作用?

如何找到版本控制系统中的某些更改?