es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

QML: No se puede obtener la altura de un elemento desde el delegado de Loader en un ListView.

Buenos días a todos,
Tengo un componente de QML llamado “Ayuda” que se supone que es una lista de tipos heterogéneos (títulos, imágenes, textos, notas). Esto se implementa como un ListView (basado en un modelo de QStringList en C++: Global.helpFields).
Cada cadena de la lista contiene un prefijo (dos caracteres) que indica el tipo, y luego el resto de la cadena es el dato a formatear por el cargador adecuado dependiendo del tipo de dato.

Hasta aquí todo bien. Los problemas comienzan cuando intento obtener la suma de la “altura” de mis objetos, para poder ajustar el tamaño adecuado del componente e incluirlo en mi GUI:

La consola.log en el código a continuación siempre muestra: estado=undefined, altura=0, …

¿Qué hice mal, por favor?

Help.qml:

ListView {
id: _helpList
ExtraAnchors.horizontalFill: parent;
spacing: 8
<…>
readonly property var helpItems: [
{ prefix: “i:”, helper: _imgComponent },
{ prefix: “h:”, helper: _headerComponent},
{ prefix: “t:”, helper: _txtComponent},
{ prefix: “n:”, helper: _notaComponent} ] ;

model: Global.helpFields // Modelo C++ de QStringList

delegate: Loader {
    id: _helpItem
    focus: (model.index === 0)
    height: (item !== null && typeof(item)!== 'undefined')? item.height: 0;
    property string _sourceValue : Global.helpFields[model.index] ;
    property string _value : _sourceValue.substr(2);
    sourceComponent:  {
        var _prefix = _sourceValue.substr(0,2);
        var length = helpItems.count;
        for (var i = 0; i < length; i++) {
            if (_prefix === helpItems[i]["prefix"]) {
                return helpItems[i]["helper"];
            }
        }
        return null;
    }
    Component.onCompleted: {
        if (model.index === 0) { Global.helpFieldsHeight = 0 ; }

        Global.helpFieldsHeight+=height;
        console.log("estado=", Component.status, " , altura=", height, ", _sourceValue=", _sourceValue, ", Cargador", ", ", _helpItem.status, ", model.index=", model.index);
    }
}

}

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código anterior es que la altura del elemento se recupera antes de que el componente se cargue realmente, lo que significa que la altura aún no está disponible. Para solucionar esto, puedes escuchar la devolución de llamada onLoaded del cargador (Loader), que se activa una vez que el componente se ha cargado correctamente, y luego recuperar la altura del elemento. Así es como puedes actualizar tu archivo Help.qml para solucionar el problema:

    ListView {
        id: _helpList
        ExtraAnchors.horizontalFill: parent;
        spacing: 8
        ...
    
        delegate: Loader {
            id: _helpItem
            focus: (model.index === 0)
            height: (item !== null && typeof(item)!== 'undefined')? item.height: 0;
            property string _sourceValue : Global.helpFields[model.index] ;
            property string _value : _sourceValue.substr(2);
            sourceComponent:  {
                var _prefix = _sourceValue.substr(0,2);
                var length = helpItems.count;
                for (var i = 0; i < length; i++) {
                    if (_prefix === helpItems[i]["prefix"]) {
                        return helpItems[i]["helper"];
                    }
                }
                return null;
            }
    
            onLoaded: {
                if (model.index === 0) { Global.helpFieldsHeight = 0 ; }
                Global.helpFieldsHeight += item.height;
                console.log("status=", Component.status, " , height=", height, ", _sourceValue=", _sourceValue, ", Loader, ", _helpItem.status, ", model.index=",model.index);
            }
        }
    }
    

    Al escuchar la devolución de llamada onLoaded y recuperar la altura del elemento desde la propiedad item, nos aseguramos de que la altura solo se recupere una vez que el elemento se haya cargado por completo y la altura esté disponible. Luego podemos actualizar la variable Global.helpFieldsHeight con la altura correcta para el elemento.

Comments are closed.