用 Loader 加载的 MapQuickItem 不显示
Posted
技术标签:
【中文标题】用 Loader 加载的 MapQuickItem 不显示【英文标题】:MapQuickItem loaded with Loader does not display 【发布时间】:2020-08-10 20:56:11 【问题描述】:我正在构建一个映射程序,最终希望根据模型中的值在地图上显示不同的项目。为了促进这一点,我在我的MapItemView
委托中使用了Loader
。
不幸的是,当我对此进行测试时,Loader
方法没有显示任何内容。
MapItemDelegate.qml
MapQuickItem
id: waypoint
anchorPoint.x: image.width/2
anchorPoint.y: image.height/2
coordinate: task.waypoint //task extends QObject with members taskname and waypoint
sourceItem: Grid:
columns: 1
rows:2
horizontalItemAlignment: Grid.AlignHCenter
Image
id: image
source: "Waypoint.png"
height: 32
width: 32
Text
id: text
text: task.taskname
main.qml
MapItemView
id: taskview
model: tasklistmodel //Extends AbstractListModel to contain task objects
delegate: Component
//Desired method, fails to display.
Loader
source:"MapItemDelegate.qml"
// Will eventually be:
// source: task.typename+"MapItemDelegate.qml" to facilitate several types.
//Control method. Works fine, but does not meet my requirements.
MapItemDelegate
//Nothing further needed.
如何让MapItemView
实际显示加载有Loader
的MapQuickItems
?是否有另一种动态加载委托进行显示的方法?
【问题讨论】:
这里使用Loader
的目的是什么?为什么不只是delegate: MapItemDelegate
?在委托中同时使用Loader
和MapItemDelegate
有什么意义?为什么不使用Column
或ColumnLayout
而不是Grid
与单列?您确定您的模型提供数据吗?
如注释的Will eventually be
部分所示,我的模型中有一个typename
字段,并希望根据它更改我的委托,这是Loader
的正常用例。 MapItemDelegate
,虽然它适用于单一类型的委托,但不符合我对每个 typename
的不同委托的要求。为了简洁起见,我在示例中都使用了两者,但在现实生活中不会。我已经确认模型包含其他视图的数据。
【参考方案1】:
事实证明,在 MapItemView
的委托中使用 Loader
是不可能的,因为 API 要求 Component
包含单个映射对象。虽然Loader
确实加载了一个映射对象,但它本身并不是一个映射对象,导致该对象无法显示。
我最终做的是实现一个自定义 QSortFilterProxyModel
覆盖 filterAcceptsRow
以过滤 tasklistmodel
以匹配 task.typename
属性,然后编辑我的 MapItemView
如下:
MapItemView
id:taskview
model: TaskListFilterModel // custom extension of QSortFilterProxyModel
acceptType:"dothisthingtype"
sourceModel: tasklistmodel
delegate:MapItemDelegate
这样,我可以为我计划在未来添加的每种类型的任务添加一个MapItemView
。虽然它远没有我希望使用Loader
实现的优雅和工作量,但它至少满足了我的要求。
【讨论】:
以上是关于用 Loader 加载的 MapQuickItem 不显示的主要内容,如果未能解决你的问题,请参考以下文章
在PyQt中创建MapQuickItem并将其添加到Map中
在 QML 中为 MapQuickItem 设置位置更新动画