You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:06:01