调用QGraphicsItem.focusItem()获取焦点项提示需参数报错如何解决
问题解决说明
错误原因
- 你调用
QGraphicsItem.focusItem()的写法错误:focusItem()是实例方法,不能直接通过QGraphicsItem类名调用,类调用需要传入对应实例参数,这就是你报错的直接原因。 - 你不需要手动调用方法获取焦点项:你已经绑定了
QGraphicsScene的focusItemChanged信号,该信号触发时会自动传递新焦点项、旧焦点项两个参数给槽函数,直接接收即可。 - 额外问题:你创建的矩形没有设置自定义名称,直接转字符串只会打印对象内存地址,不会显示你想要的名称;同时代码中用到的
num_list没有定义,会触发额外报错。
你用到的示例窗口参考:
修复后的完整代码
import sys from PySide2 import QtWidgets, QtUiTools, QtCore, QtGui from PySide2.QtWidgets import QGraphicsItem # 补全全局序号列表,可根据你的需求调整初始化规则 num_list = [f"矩形_{i}" for i in range(1, 11)] # 替换为你的ui文件实际存储路径 ui_path = "your_ui_file_path.ui" 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) def creator(self): rect = self.scene.addRect(-20,-20,40,40, QtGui.QPen(QtCore.Qt.red), QtGui.QBrush(QtCore.Qt.gray)) rect.setFlag(QGraphicsItem.ItemIsMovable) rect.setFlag(QGraphicsItem.ItemIsFocusable) rect.setFlag(QGraphicsItem.ItemIsSelectable) # 给矩形存储自定义名称 rect_name = num_list.pop(0) rect.setData(QtCore.Qt.UserRole, rect_name) # 接收信号传递的焦点项参数 def nameDisplay(self, new_focus_item, old_focus_item): if new_focus_item: rect_name = new_focus_item.data(QtCore.Qt.UserRole) self.ui.name_line.setText(str(rect_name)) else: # 无选中项时清空显示 self.ui.name_line.clear() if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) rectangles_window = rectangles() rectangles_window.show() sys.exit(app.exec_())
修改点说明
- 移除了错误的
self.current_focus_obj = QGraphicsItem.focusItem()调用逻辑 - 给
nameDisplay槽函数添加信号传递的new_focus_item参数,直接通过该参数获取当前选中的矩形 - 新增
setData逻辑给每个矩形存储自定义名称,显示时直接读取即可得到你设定的矩形标识 - 补全了缺失的全局列表定义、程序启动逻辑,确保代码可正常运行
内容的提问来源于stack exchange,提问作者galaxy
相关产品推荐
相关产品推荐

