我有两个问题:
deviceTransform is the transformation that applies to the view, and needs to be provided if the scene contains items that ignore transformations.
这是我的代码:
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。QTransform()在itemAt()中是什么意思?
因为它指示文档,所以只有当有项忽略转换时才需要传递deviceTransform,那么如何才能使项不支持转换?必须启用标志
Qt::ItemIgnoresTransformations
。在使用您的代码,您看不到差异,因此我实现了下面的示例,其中有两个项一个带有ItemIgnoresTransformations激活的标志,另一个没有。然后,当您按下任何一个项目时,预计该项目将在控制台中打印出来,但是您将看到,如果您传递QTransform(),则具有ItemIgnoresTransformations标志的项将返回None;如果您按radiobutton传递viewPortTransformation(),您将看到这两个项都在控制台上打印。因此,如果有任何项启用了itemIgnorestTransformations标志,则必须传递deviceTransform。在
2。为什么focusItemChanged信号不工作?
如果项目的焦点发生变化,则会触发该信号,但默认情况下项目没有焦点,因此不会发出信号,解决方案是激活标志
^{pr2}$QGraphicsItem::ItemIsFocusable
:相关问题 更多 >
编程相关推荐