【问题标题】:How to set an item property of one qml from main.qml如何从 main.qml 设置一个 qml 的 item 属性
【发布时间】:2018-01-06 11:30:46
【问题描述】:

我浪费时间寻找如何将可见属性设置为 false,委托位于另一个 qml 文件中。

例如,这里是一个基于 Places Map 的简单示例。

Marker.qml

import QtQuick 2.0
import QtLocation 5.6

MapQuickItem {
    id: idPointsMarker

    sourceItem: Loader{sourceComponent: idRect}

    visible: true //if set manually to false, everything works correctly

    Component{
        id: idRect
        Rectangle{
            width: 20
            height: 20
            color: "blue"
        }
    }
}

和main.qml

import QtQuick 2.0
import QtQuick.Window 2.0
import QtLocation 5.6
import QtPositioning 5.6

Window {
    width: 512
    height: 512
    visible: true

    PositionSource {
        ...
    }

    property variant locationOslo: QtPositioning.coordinate( 59.93, 10.76)


    PlaceSearchModel {
        ...
    }

    Map {
        id: map
        anchors.fill: parent
        plugin: Plugin {name: "osm"}
        center: locationOslo
        zoomLevel: 13

        MouseArea {
            id : mouseMap
            anchors.fill: parent
            onDoubleClicked: {
                console.log("DoubleClicked")
                Marker.idPointsMarker.visible = false // pb is here

            }
        }

        MapItemView {
            model: searchModel
            delegate: Marker{
                coordinate: place.location.coordinate
            }
        }
    }
}

我希望在双击时将可见性切换为 false。我无法以我写的方式访问该属性。正确的语法是什么?

抱歉,问了这么简单的问题。感谢您的帮助。

【问题讨论】:

    标签: qt qml qt5


    【解决方案1】:

    你不必在 main.qml 中设置属性,你必须在 Marker.qml 中设置,因为 Marker.qml 的元素可以访问 main.qml 的所有元素。一种解决方案是建立一个 bool 类型的属性来管理可见性并在双击时更改:

    ma​​in.qml

    Map {
        [...]
        property bool isVisibleItems: true
    
        MouseArea {
            id : mouseMap
            anchors.fill: parent
            onDoubleClicked: map.isVisibleItems = !map.isVisibleItems
        }
        [...]
    

    Marker.qml

    import QtQuick 2.0
    import QtLocation 5.6
    
    MapQuickItem {
        id: idPointsMarker
        sourceItem: Loader{sourceComponent: idRect}
        visible: map.isVisibleItems
    
        Component{
            id: idRect
            Rectangle{
                width: 20
                height: 20
                color: "blue"
            }
        }
    }
    

    下面link有一个例子

    【讨论】:

    • 再次感谢 eyllanesc。我永远不会找到这个解决方案。所以我必须完全扭转我的想法:main.qml 对其他 qml 的参数没有可见性,但是任何其他 qml 对 main.qml 设置都有可见性......它非常狡猾。
    • 完成,谢谢。我没有注意到通过调用 main 获取属性值的困难与在加载器中创建显式属性之间的联系,即使想法是相同的。在我的示例中,loader 仅用于内存,但如果它是一个简单的矩形,我的语法问题和错误分析将是相同的,我想是相同的解决方案。要修改除 main 之外的 qml 中的任何属性,我们必须从其原点修改它,而不是在 main 中。为此,必须主要创建一个属性。如果从 menu.qml 中的按钮更改颜色以在 marquer.qml 中执行操作怎么办?
    • 请不要将此作为“解决方案”!应不惜一切代价避免引用位于同一 QML 文件中的 NOT 的 id!您必须使用所谓的dependency injection 模式并将所有需要的属性传递给组件(Marker.qml
    猜你喜欢
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    相关资源
    最近更新 更多