使用 QGraphicsItem.focusItem() 检查哪个项目处于焦点上
Checking which item is on focus with QGraphicsItem.focusItem()
所以这是我正在做的这个练习,每当我点击“create_button”时我需要在 QGraphicsScene 中创建方块,当我点击任何方块时,应该显示该方块的名称在 QLabel 中,它位于 QGraphicsView 下,这就是我尝试这样做的方式。
这是我用的window
这是代码
class rectangles(QtWidgets.QDialog):
def __init__(self):
super(rectangles, self).__init__()
loader = QtUiTools.QUiLoader()
self.ui = loader.load(ui_path, self)
self.variables()
self.ui.create_button.clicked.connect(self.creator)
self.scene.focusItemChanged.connect(self.nameDisplay)
def variables(self):
self.scene = QtWidgets.QGraphicsScene()
self.ui.canvas_area.setScene(self.scene)
self.current_focus_obj = QGraphicsItem.focusItem() #the problem is in here
def creator(self):
rect = self.scene.addRect(-20,-20,40,40, QPen(Qt.red), QBrush(Qt.gray))
rect.setFlag(QGraphicsItem.ItemIsMovable)
rect.setFlag(QGraphicsItem.ItemIsFocusable)
rect.setFlag(QGraphicsItem.ItemIsSelectable)
num_list.remove(num_list[0])
def nameDisplay(self):
self.ui.name_line.setText(str(self.current_focus_obj)) #Here I try to set
#the name of the
#active rectangle
#to my QLabel
if __name__ == '__main__':
rectangles_window = rectangles()
rectangles_window.ui.show()
但是,当我 运行 此代码时,出现以下错误:
# Error: TypeError: file <maya console> line 32: descriptor 'focusItem' of 'PySide2.QtWidgets.QGraphicsItem' object needs an argument #
老实说,我真的不明白我应该在 focusItem() 中传递什么参数,这就是问题所在。我认为它不需要任何参数,因为它应该 return 当前关注的任何对象。
这可能是一个小问题,但它现在确实减慢了我的步伐,所以如果有人能提供帮助,我将不胜感激:)
你不尊重信号QGraphicsScene::focusItemChanged。您必须将它连接到接收这些参数的函数:
def nameDisplay(self, newFocusItem, oldFocusItem, reason):
# ...presumably use newFocusItem
这样写也是错误的:
self.current_focus_obj = QGraphicsItem.focusItem()
因为那个函数不是静态的。它必须在 QGraphicsItem
.
的实例上调用
所以这是我正在做的这个练习,每当我点击“create_button”时我需要在 QGraphicsScene 中创建方块,当我点击任何方块时,应该显示该方块的名称在 QLabel 中,它位于 QGraphicsView 下,这就是我尝试这样做的方式。
这是我用的window
这是代码
class rectangles(QtWidgets.QDialog):
def __init__(self):
super(rectangles, self).__init__()
loader = QtUiTools.QUiLoader()
self.ui = loader.load(ui_path, self)
self.variables()
self.ui.create_button.clicked.connect(self.creator)
self.scene.focusItemChanged.connect(self.nameDisplay)
def variables(self):
self.scene = QtWidgets.QGraphicsScene()
self.ui.canvas_area.setScene(self.scene)
self.current_focus_obj = QGraphicsItem.focusItem() #the problem is in here
def creator(self):
rect = self.scene.addRect(-20,-20,40,40, QPen(Qt.red), QBrush(Qt.gray))
rect.setFlag(QGraphicsItem.ItemIsMovable)
rect.setFlag(QGraphicsItem.ItemIsFocusable)
rect.setFlag(QGraphicsItem.ItemIsSelectable)
num_list.remove(num_list[0])
def nameDisplay(self):
self.ui.name_line.setText(str(self.current_focus_obj)) #Here I try to set
#the name of the
#active rectangle
#to my QLabel
if __name__ == '__main__':
rectangles_window = rectangles()
rectangles_window.ui.show()
但是,当我 运行 此代码时,出现以下错误:
# Error: TypeError: file <maya console> line 32: descriptor 'focusItem' of 'PySide2.QtWidgets.QGraphicsItem' object needs an argument #
老实说,我真的不明白我应该在 focusItem() 中传递什么参数,这就是问题所在。我认为它不需要任何参数,因为它应该 return 当前关注的任何对象。 这可能是一个小问题,但它现在确实减慢了我的步伐,所以如果有人能提供帮助,我将不胜感激:)
你不尊重信号QGraphicsScene::focusItemChanged。您必须将它连接到接收这些参数的函数:
def nameDisplay(self, newFocusItem, oldFocusItem, reason):
# ...presumably use newFocusItem
这样写也是错误的:
self.current_focus_obj = QGraphicsItem.focusItem()
因为那个函数不是静态的。它必须在 QGraphicsItem
.