PyQt5:关于qgraphicscene的itemAt()和focusItemChanged()的问题

2024-09-28 22:41:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个问题:

  1. QTransform()在itemAt()中是什么意思?下面这句话是Qt-doc上说的,但我不明白:

deviceTransform is the transformation that applies to the view, and needs to be provided if the scene contains items that ignore transformations.

  1. 为什么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_())

任何帮助都将不胜感激。在


Tags: thetoimportselfifthatdemosys
1条回答
网友
1楼 · 发布于 2024-09-28 22:41:24

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

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

使用您的代码,您看不到差异,因此我实现了下面的示例,其中有两个项一个带有ItemIgnoresTransformations激活的标志,另一个没有。然后,当您按下任何一个项目时,预计该项目将在控制台中打印出来,但是您将看到,如果您传递QTransform(),则具有ItemIgnoresTransformations标志的项将返回None;如果您按radiobutton传递viewPortTransformation(),您将看到这两个项都在控制台上打印。因此,如果有任何项启用了itemIgnorestTransformations标志,则必须传递deviceTransform。在

import sys
from PyQt5 import QtCore, QtGui, QtWidgets


class Demo(QtWidgets.QGraphicsView):
    def __init__(self):
        super(Demo, self).__init__()
        self._scene = QtWidgets.QGraphicsScene()
        self._scene.setSceneRect(0, 0, 300, 300)
        self.setScene(self._scene)
        self.rect1 = self._scene.addRect(
            100, 30, 100, 30, brush=QtGui.QBrush(QtGui.QColor("red"))
        )
        self.rect1.setFlag(QtWidgets.QGraphicsItem.ItemIgnoresTransformations)

        self.rect2 = self._scene.addRect(
            200, 30, 100, 30, brush=QtGui.QBrush(QtGui.QColor("green"))
        )

        self.rotate(50)
        self._use_deviceTransform = False

    def mousePressEvent(self, event):
        sp = self.mapToScene(event.pos())
        item = self._scene.itemAt(
            sp,
            self.viewportTransform()
            if self._use_deviceTransform
            else QtGui.QTransform(),
        )
        print(item)

    def set_use_deviceTransform(self, t):
        self._use_deviceTransform = t


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    radiobutton = QtWidgets.QRadioButton("use deviceTransform")
    demo = Demo()
    radiobutton.toggled.connect(demo.set_use_deviceTransform)
    w = QtWidgets.QWidget()
    lay = QtWidgets.QVBoxLayout(w)
    lay.addWidget(radiobutton)
    lay.addWidget(demo)
    w.show()
    w.resize(640, 480)
    sys.exit(app.exec_())

2。为什么focusItemChanged信号不工作?

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

^{pr2}$

相关问题 更多 >