用 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
        
    

ma​​in.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 实际显示加载有LoaderMapQuickItems?是否有另一种动态加载委托进行显示的方法?

【问题讨论】:

这里使用Loader的目的是什么?为什么不只是delegate: MapItemDelegate ?在委托中同时使用LoaderMapItemDelegate 有什么意义?为什么不使用ColumnColumnLayout 而不是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中

webpack中loader为啥是从后往前加载的

在 QML 中为 MapQuickItem 设置位置更新动画

关于加载测试用例的一些问题

Android 图片加载框架Universal-Image-Loader源码解析

qml Loader异步导致ComBoBox数据乱序