如何修复DelegateModel中qmllint的“Unqualified access”警告
解决DelegateModel传递外部属性的qmllint警告问题
问题根源
qmllint抛出的「Unqualified access」警告,是因为DelegateModel的delegate默认运行在模型项的局部上下文中,直接引用外部的root、todosContainer等对象时,解析器无法确认这些引用的作用域安全性,担心委托创建时可能找不到这些对象。
正确解决方案
方案1:用DelegateModel的contextProperties注入外部引用
把需要传递的外部对象统一注入到委托的上下文里,明确告诉qmllint这些引用的来源:
DelegateModel { id: visualModel model: columnModel // 将外部对象注入到委托上下文 contextProperties: [ "rootRef", root, "todosContainerRef", todosContainer, "todosColumnsViewRef", todosColumnsView, "columnModelRef", columnModel ] delegate: TodoColumnDelegate { todoColumnContentHeight: todosContainerRef.height - rootRef.marginsSize*3 rootContainer: rootRef rootTodoContainer: todosContainerRef todosColumnsViewPointerFromColumn: todosColumnsViewRef titlesAndTasksData: rootRef.titlesAndTasksData themeData: rootRef.themeData areTasksReversed: rootRef.areTasksReversed columnModelPointer: columnModelRef taskModel: rootRef.taskModelByColumnIDDict[columnID] } }
方案2:用Component包裹委托,明确作用域
把委托定义成独立的Component,Component的上下文继承自它的父级(也就是你当前的kanbanMain.qml上下文),这样里面的外部对象引用能被正确解析:
// 先定义独立的委托组件 Component { id: todoColumnDelegateComp TodoColumnDelegate { todoColumnContentHeight: todosContainer.height - root.marginsSize*3 rootContainer: root rootTodoContainer: todosContainer todosColumnsViewPointerFromColumn: todosColumnsView titlesAndTasksData: root.titlesAndTasksData themeData: root.themeData areTasksReversed: root.areTasksReversed columnModelPointer: columnModel taskModel: root.taskModelByColumnIDDict[columnID] } } // 再关联到DelegateModel DelegateModel { id: visualModel model: columnModel delegate: todoColumnDelegateComp }
关于required属性无效的原因
required属性只是要求组件创建时必须赋值,但DelegateModel创建委托时,是在模型项的局部上下文里初始化的,不会自动帮你传递外部对象的引用。所以单纯给委托属性加required,只会因为没有初始化值而报错,解决不了作用域解析的问题。
内容的提问来源于stack exchange,提问作者Notes
相关产品推荐
相关产品推荐

