Python PyQt5:关于QGraphicscene';s itemAt()和focusItemChanged()

Python PyQt5:关于QGraphicscene';s itemAt()和focusItemChanged(),python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我有两个问题: itemAt()中的QTransform()是什么意思?下面这句话是Qt doc里说的,但我不明白: deviceTransform是应用于视图的变换,如果场景包含忽略变换的项目,则需要提供该变换 为什么focusItemChanged信号不工作 这是我的密码: import sys from PyQt5.QtGui import QTransform from PyQt5.QtWidgets import QApplication, QGraphicsItem, QGraphi

我有两个问题:

  • itemAt()中的QTransform()是什么意思?下面这句话是Qt doc里说的,但我不明白:
  • deviceTransform是应用于视图的变换,如果场景包含忽略变换的项目,则需要提供该变换

  • 为什么focusItemChanged信号不工作
  • 这是我的密码:

    import sys
    from PyQt5.QtGui import QTransform
    from PyQt5.QtWidgets import QApplication, QGraphicsItem, QGraphicsScene, QGraphicsView
    
    
    class Demo(QGraphicsView):
        def __init__(self):
            super(Demo, self).__init__()
            self.resize(300, 300)
    
            self.scene = QGraphicsScene()
            self.scene.setSceneRect(0, 0, 300, 300)
    
            self.rect = self.scene.addRect(100, 30, 100, 30)
            self.ellipse = self.scene.addEllipse(100, 80, 50, 40)
    
            self.rect.setFlags(QGraphicsItem.ItemIsMovable | QGraphicsItem.ItemIsSelectable)
            self.ellipse.setFlags(QGraphicsItem.ItemIsMovable | QGraphicsItem.ItemIsSelectable)
    
            self.setScene(self.scene)
    
            # Question 1
            print(self.scene.itemAt(110, 40, QTransform()))
    
            # Question 2
            self.scene.focusItemChanged.connect(self.my_slot)
    
        def my_slot(self, new_item, old_item):
            print(new_item)
            print(old_item)
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        demo = Demo()
        demo.show()
        sys.exit(app.exec_())
    

    任何帮助都将不胜感激。

    1。itemAt()中的QTransform()是什么意思?

    当它指示文档时,只有在存在忽略转换的项时才需要传递deviceTransform,那么如何使项不支持转换?您必须启用标志
    Qt::ItemIgnoresTransformations

    对于代码,您看不到差异,因此我实现了以下示例,其中有两个项,一个是激活了标记ItemIgnorestTransformations,另一个是未激活。然后,当您按下任何项目时,预期该项目将在控制台中打印,但如果您通过QTransform(),您将看到具有ItemIgnoresTransformations标志的项目返回None,如果您按下单选按钮通过viewportTransform(),您将看到现在这两个项目都在控制台上打印。因此,如果有任何项启用了标记ItemIgnorestTransformations,则必须传递deviceTransform

    导入系统 从PyQt5导入QtCore、QtGui、QtWidgets 类演示(QtWidgets.QGraphicsView): 定义初始化(自): 超级(演示,自我)。\uuuu初始化 self._scene=qtwidts.qgraphicscene() self._scene.setscen直立(0,0,300,300) self.setScene(self.\u场景) self.rect1=self.\u scene.addRect( 100,30,100,30,brush=QtGui.QBrush(QtGui.QColor(“红色”)) ) self.rect1.setFlag(QtWidgets.QGraphicsItem.ItemIgnorestTransformations) self.rect2=self.\u scene.addRect( 200,30,100,30,brush=QtGui.QBrush(QtGui.QColor(“绿色”)) ) 自转(50) self.\u use\u deviceTransform=False def鼠标压力事件(自身、事件): sp=self.maptosene(event.pos()) item=self.\u scene.itemAt( 服务提供商, self.viewportTransform() 如果是自己,请使用设备转换 else QtGui.QTransform(), ) 打印(项目) def设置使用设备转换(自身,t): 自使用设备转换=t 如果名称=“\uuuuu main\uuuuuuuu”: app=qtwidts.QApplication(sys.argv) radiobutton=qtwidts.QRadioButton(“使用设备转换”) demo=demo() 单选按钮。切换。连接(演示。设置\u使用\u设备转换) w=qtwidts.QWidget() lay=qtwidts.QVBoxLayout(w) lay.addWidget(单选按钮) lay.addWidget(演示) w、 show() w、 调整大小(640480) sys.exit(app.exec_()) 2。为什么focusItemChanged信号不工作?

    如果项目的焦点发生变化,则会触发信号,但默认情况下,项目没有焦点,因此不会发出信号,解决方案是激活标志
    QGraphicsItem::ItemIsFocusable

    导入系统 从PyQt5.QtGui导入QTransform 从PyQt5.QtWidgets导入QApplication、QGraphicsSitem、QGraphicscene、QGraphicsView 从PyQt5.QtCore导入pyqtlot,Qt 课堂演示(QGraphicsView): 定义初始化(自): 超级(演示,自我)。\uuuu初始化 自我调整大小(300300) self.scene=qgraphicscene() self.scene.setscen直立(0,0,300300) self.rect=self.scene.addRect(100,30,100,30) self.eliple=self.scene.addEllipse(100,80,50,40) self.rect.setFlags( QGraphicsItem.items可编辑 |QGraphicsItem.ItemIsSelectable |QGraphicsItem.ItemIsFocusable ) self.eliple.setFlags( QGraphicsItem.items可编辑 |QGraphicsItem.ItemIsSelectable |QGraphicsItem.ItemIsFocusable ) self.setScene(self.scene) self.scene.focusItemChanged.connect(self.my_插槽) @pyqtSlot(“QGraphicsItem*,“QGraphicsItem*”,Qt.FocusReason) 定义我的\u插槽(自身、新\u项目、旧\u项目、原因): 打印(旧项目、新项目)
    谢谢,问题2的答案解决了问题。期待对QTransform()的解释。但是在我的代码中,我没有启用Qt.ItemIgnorestTransformations,我在itemAt()中添加了QTransform(),只是为了避免错误。那么我还可以传递给itemAt()什么来运行而不会出错呢?@很高兴不,在您的情况下,您应该只继续使用QTransform(),因为没有任何项激活了标记ItemIgnorestTransformations。我从你的问题中了解到的是,你想知道什么时候应该将不同的deviceTransform传递给QTransform()@很高兴你的原始代码有错误吗?在itemAt()的情况下,您的初始代码对我来说是正确的。谢谢!我现在明白了。