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
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()的情况下,您的初始代码对我来说是正确的。谢谢!我现在明白了。