propiedades del objeto qml

                       
Propiedades del

        objeto QML Cada tipo de objeto QML define una serie de propiedades. Cada vez que se crea una instancia del tipo de objeto, estos atributos de la instancia también se crean automáticamente. A continuación discutimos varios tipos diferentes de atributos.

atributo id
           Cada tipo de objeto QML tiene un atributo id determinado de forma única. Este atributo lo proporciona el lenguaje QML en sí mismo y no se puede redefinir ni sobrecargar en el tipo de objeto QML.

        Debemos especificar un valor para el atributo id para permitir que el objeto se identifique de forma única y esté disponible para referencia de otros objetos. El valor del atributo Id debe comenzar con una letra minúscula o un guión bajo, y solo puede contener caracteres como letras, números y guiones bajos.

        El siguiente es un objeto TextInput y un objeto Text. La propiedad id del objeto TextInput es "myTextInput". El valor de la propiedad de texto del objeto Text se establece igual que el valor de la propiedad de texto del objeto TextInput a través de myTextInput.text.

         Luego podemos referirnos al objeto a través del atributo id en el dominio visible del componente. Por lo tanto, el valor del atributo id debe ser único dentro del dominio visible del componente.

         Una vez que se crea la instancia del objeto, el valor del atributo id no se puede cambiar. El atributo Id parece un atributo ordinario, pero no es un atributo ordinario real. Le aplicamos una semántica especial, por ejemplo: en el ejemplo anterior, no podemos usar myTextInput.id.

El atributo de la propiedad
        de una propiedad es una propiedad de un objeto, se puede asignar al valor estática o dinámicamente ligada a la expresión. El valor de una propiedad puede ser leído por otros objetos. En general, la propiedad de la propiedad también puede ser modificada por otros objetos, a menos que el tipo QML especifique explícitamente que la propiedad de la propiedad no se puede modificar.

 [Definir propiedad propiedad]

   Una propiedad de propiedad puede definirse en C ++ y registrarse con el sistema de tipos QML a través de Q_PROPERTY. Por supuesto, también podemos personalizar las propiedades del objeto en el documento QML mediante la siguiente sintaxis:

         De esta manera, un objeto puede exponer algunos valores específicos a otros objetos, o es más fácil mantener un estado interno.

         El nombre de la propiedad debe comenzar con una letra minúscula y solo puede contener letras, números y guiones bajos. Las palabras clave reservadas de JavaScript no se pueden usar como el nombre del atributo de propiedad. La palabra clave predeterminada es opcional, y los detalles de los modificadores de propiedad predeterminados y predeterminados se discutirán más adelante.

         La definición de una propiedad de propiedad personalizada crea implícitamente una señal de cambio de valor para la propiedad de propiedad, que está asociada con un controlador de señal nombrado en <PropertyName> Modificado. <PropertyName> es el nombre de la propiedad, y la primera letra debe estar en mayúscula.

         Por ejemplo: lo siguiente define dos propiedades de propiedad e implementa su controlador de señal:

[Tipo legal de atributo de propiedad personalizada]

      Los tipos enumerados en los tipos básicos de QML se pueden usar como tipos de atributos de propiedades personalizadas. Por ejemplo: Las siguientes son todas las declaraciones de atributos de propiedad legal:

        Algunos tipos básicos proporcionados por el módulo QtQuick no pueden utilizarse como tipos de propiedad a menos que el módulo QtQuick se importe en el documento QML.

       El tipo básico de var es un tipo general, que puede guardar cualquier tipo de valor, incluidas listas y objetos:

        Además, cualquier tipo de objeto QML se puede usar como el tipo de atributo de propiedad. Por ejemplo:

        Esto también es aplicable a los tipos de QML personalizados. Si se define un tipo QML en el archivo ColorfulButton.qml, la propiedad de propiedad del tipo ColorfulButton también es legal.

  [Valor de propiedad legal]

Podemos asignar valores a atributos de propiedad definidos de dos maneras:

  * Inicialización

  * Asignar

  El valor puede ser un valor estático o una expresión vinculante.

  {Inicialización}

    Inicialización de propiedad de propiedad:

     También podemos inicializar la asignación al definir la propiedad de propiedad:

       Ejemplos de asignación inicial son los siguientes:

{Asignación}

     Podemos usar el código JavaScript para asignar valores al atributo de propiedad de la siguiente manera:

     Los ejemplos son los siguientes:

[Valor de propiedad legal]

     Como se mencionó anteriormente, podemos asignar dos tipos de valores al atributo de propiedad: valores estáticos y expresiones de enlace:

     Ejemplos:

        En muchos casos, el valor del tipo de cadena se puede convertir automáticamente a muchos tipos diferentes de valores, porque QML proporciona la conversión del tipo de cadena a otros tipos (es por eso que puede asignar el valor "rojo" al atributo de color).

         Se debe prestar especial atención en que en el caso de vinculación a una expresión, la expresión de la derecha debe devolver el valor de la función Qt.binding () que devuelve el tipo de valor apropiado. Se puede asignar una expresión directamente cuando se inicializa la propiedad de propiedad, sin la necesidad de usar esa función (de hecho, usar la función también causará errores).

 【Tipo de seguridad】

       Los atributos son todos de tipo seguro. El valor asignado al atributo debe coincidir con el tipo.

       Por ejemplo, la siguiente asignación causará un error:

         Si a la propiedad se le asigna un valor incorrecto en tiempo de ejecución, la asignación no tendrá éxito y se generará un error.

        Como se mencionó anteriormente, algunos tipos de atributos no tienen buenos tipos para expresar sus valores. En este momento, el motor QML proporciona una buena conversión de tipo de cadena. Por ejemplo: atributo de color, el tipo de valor almacenado en este atributo debe ser el tipo de color en lugar del tipo de cadena, pero puede asignarle un valor de tipo de cadena sin error.

[Tipo de atributo de propiedad especial]

     Propiedad de propiedad del tipo de lista de objetos

     A la propiedad de propiedad del tipo Lista también se le puede asignar el valor de la lista de tipos de objetos QML. La forma de asignación es la siguiente:

        Por ejemplo: el tipo de elemento tiene un atributo de estado, que se puede usar para guardar una lista de tipos de objetos de estado. El siguiente código se utiliza para inicializar la lista:

        Si la lista contiene solo un elemento, se pueden omitir los corchetes:

        Podemos definir las propiedades de propiedad del tipo de lista de objetos de la siguiente manera:

      Los ejemplos de declaración de propiedades de tipo de lista son los siguientes:

       Si desea declarar una propiedad para almacenar valores de lista, pero no necesariamente para almacenar valores de tipo de objeto QML, debe declarar la propiedad de propiedad de var.

[Propiedades agrupadas]

        En algunos casos, podemos dividir los atributos en grupos de sub-atributos según la lógica. Estos sub-atributos se pueden asignar por "." O por grupo.

        Por ejemplo: el tipo de texto tiene un atributo de grupo de fuentes. A continuación, el primer objeto de Texto usa "." Para inicializar el valor de la fuente, y el segundo usa el grupo para asignar el valor:

        Los tipos de atributos de grupo son todos tipos básicos. El lenguaje QML proporciona parte de estos tipos básicos y el módulo Qt Quick proporciona la otra parte.

 【Alias ​​de atributo】

         Un alias de atributo es guardar una referencia a otro atributo. A diferencia de la definición de atributos comunes, la definición de atributos comunes requiere la asignación de un nuevo espacio de almacenamiento único, y un alias de atributo simplemente está conectado al atributo.

         Definición del alias del atributo La definición del atributo raíz es similar, excepto que el alias del atributo necesita usar la palabra clave alias en lugar del tipo de propiedad en la definición del atributo. El valor de la derecha debe ser un alias de referencia legal:

        A diferencia de los atributos ordinarios, un alias solo puede referirse a un objeto o un atributo de un objeto.

        Por ejemplo: el siguiente tipo de botón tiene un alias de la propiedad buttonText, que está vinculada a la propiedad de texto del objeto de texto secundario:

       El siguiente código crea un botón y define una cadena de texto:

        Modifique buttonText, modifique directamente el valor de textItem.text, no modificará otros valores. Si buttonText no es un alias de atributo, la modificación de su valor no modificará el texto mostrado, ya que el enlace de atributo no es bidireccional.

[Considerando los alias de atributo]

     El alias de propiedad se activará solo después de que el componente se haya inicializado completamente. Si se hace referencia a un alias no inicializado, se generará un error. Además, generar un alias de atributo para un alias de atributo también causará un error:

        Podemos crear un alias de atributo con el mismo nombre para un atributo existente, que sobrescribirá el atributo existente. Por ejemplo: El siguiente tipo QML tiene un alias para el atributo de color y el atributo Rectángulo incorporado Rectángulo :: atributo de color:

[Atributo predeterminado]

         Una definición de objeto puede contener un atributo predeterminado. Si un objeto hijo object () se define en otro objeto (objeto padre) sin asignar ningún atributo al objeto padre, entonces el objeto hijo es el valor de la propiedad predeterminada del objeto padre. Se requiere que la palabra clave predeterminada se declare como el atributo predeterminado.

        Por ejemplo, el objeto en el siguiente archivo MyLabel.qml tiene una propiedad predeterminada de someText:

       Podemos asignar propiedades predeterminadas de someText en la definición del objeto MyLabel:

        Los dos anteriores son equivalentes al siguiente:

       Sin embargo, debido a que la propiedad someText está marcada como la propiedad predeterminada, no es necesario asignar explícitamente el objeto Text a esta propiedad predeterminada.

       También puede haber notado que los subobjetos se pueden agregar a cualquier tipo de elemento sin agregarlos explícitamente a los subatributos. Esto se debe a que el atributo predeterminado del elemento es el atributo de datos, y cualquier objeto agregado al elemento se agrega automáticamente a su lista de objetos secundarios.

        Los atributos predeterminados son muy útiles para reasignar subobjetos. Eche un vistazo al ejemplo de TabWidget, que utiliza las propiedades predeterminadas para reasignar automáticamente los objetos secundarios de TabWidget como su lista de objetos secundarios.

 [Atributo de solo lectura]

   La definición de cualquier objeto puede usar la palabra clave de solo lectura para definir atributos de solo lectura, usando la siguiente sintaxis:

       El atributo de solo lectura debe especificar un valor durante la inicialización. Una vez que se inicializa el atributo de solo lectura, ya no se puede asignar, ya sea una asignación (usando "=") u otros medios.

       Por ejemplo, el siguiente bloque de código Component.onCompleted es ilegal:

Nota: Un atributo de solo lectura no se puede declarar como un atributo predeterminado o un alias de atributo.

 【Objeto de modificación de atributo】

       Los atributos pueden tener objetos de modificación de valor de atributo asociados con ellos. Podemos definir atributos para modificar la instancia del objeto de la siguiente manera y asociarlos con atributos específicos:

        Cabe señalar que la sintaxis anterior es en realidad una declaración de objeto que instanciará una propiedad existente de una operación de objeto.

       Los tipos de modificación de atributos específicos solo se pueden aplicar a tipos de atributos específicos, pero el lenguaje no lo impone. Por ejemplo: el tipo NumberAnimation proporcionado por el módulo QtQuick solo afecta las propiedades de los tipos numéricos (como int o real). Si se usa NumberAnimation para propiedades no numéricas, no causará un error, pero las propiedades no numéricas no generarán animación. Las acciones de tipo de modificación de atributo están estrechamente relacionadas con la realización de atributos específicos.

 La señal de propiedad de
        señal es una notificación del tipo de objeto cuando ocurren ciertos eventos: por ejemplo, un cambio de propiedad, una animación comienza o se detiene, o cuando se completa una descarga de imagen. Por ejemplo, el tipo MouseArea emite una señal de clic cuando el usuario hace clic.

        Cuando se emite una señal, el objeto puede ser notificado a través de un controlador de señal. La sintaxis de definición de un controlador de señal está en <Señal>, <Señal> es el nombre de la señal y la primera letra debe estar en mayúscula. El controlador de señal debe implementarse dentro de la definición del objeto que emite la señal, y el controlador de señal debe incluir un bloque de código JavaScript, que se ejecutará cuando se llame al controlador de señal.

         Por ejemplo, la definición del objeto MouseArea puede definir un controlador de señal de tipo onClicked. Cuando se hace clic en MouseArea, se llama al controlador de señal, lo que hace que la consola imprima el mensaje:

[Definir atributo de señal]

        Podemos usar Q_SIGNAL para definir propiedades de señal en clases C ++ y registrarlas con el sistema de tipos QML. Opcionalmente, también podemos usar la siguiente sintaxis para definir el atributo de señal en el documento QML:

        La definición de dos señales o métodos con el mismo nombre en un bloque de tipo generará un error. Sin embargo, podemos usar el tipo de señal existente para definir una nueva señal (esto hará que la señal anterior sea invisible)

       El siguiente es un ejemplo de una definición de señal:

         Si una señal no tiene parámetros, entonces "()" es opcional. Si se utilizan parámetros, se debe especificar el tipo de parámetro, como los parámetros de cadena y val en la señal de acción realizada anteriormente. Los tipos de parámetros permitidos son los mismos que los definidos en la propiedad de propiedad descrita anteriormente.

       Para emitir una señal, se llama a un método. Cualquier controlador de señal asociado con la señal se ejecutará cuando se emita la señal, y los controladores pueden usar el nombre de los parámetros de señal definidos y obtener los parámetros esperados.

[Señal de cambio de atributo]

        El tipo QML también proporciona señales de cambio de atributo incorporadas, que se emiten cuando se cambia el valor del atributo. A continuación, presentaremos los beneficios de las señales y cómo usarlas.

[Atributo del controlador de señal]

        Los manejadores de señales son tipos de atributos de métodos especiales. Cuando se emite la señal, se llamará al método específico asociado con la señal. Agregar una señal a QML agregará automáticamente un controlador de señal asociado con él. Por defecto, la función estará vacía. El cliente puede proporcionar su propia implementación para implementar la lógica del programa:

       Considere el siguiente tipo SquareButton, que se define en el archivo SquareButton.qml y define dos señales: activadas y desactivadas:

        Estas señales se pueden obtener de cualquier objeto SquareButton en otros archivos QML en el mismo directorio. El cliente también proporciona la implementación del controlador de señal:

[Controlador de señal de cambio de propiedad]

        La sintaxis del controlador de señal para el cambio de propiedad es la siguiente en <Property> Modificado, <Property> es el nombre de la propiedad, la primera letra debe estar en mayúscula. Por ejemplo, aunque el documento de tipo TextInput no define la señal textChanged, esta señal está disponible porque TextInput tiene un atributo text. Por lo tanto, también podemos implementar el controlador de señal onTextChanged, que se llamará cuando se cambie el valor de la propiedad:

Propiedades
           del método Se llama al método de un objeto cuando realiza algún procesamiento o activa algunos eventos. Cuando un método está conectado a una señal, estos métodos se ejecutan cuando se transmite la señal.

[Definir atributos del método]

        Podemos usar Q_INVOKABLE para registrarse en el sistema de tipos QML a través de funciones en clases C ++ o Q_SLOT en clases C ++. Opcionalmente, también podemos agregar métodos personalizados al objeto en el documento QML:

       Se pueden agregar métodos a los tipos QML para definir un código JavaScript reutilizable separado. Estos métodos pueden ser llamados internamente o por objetos externos.

       A diferencia de las señales, no hay necesidad de definir tipos de parámetros aquí, ya que por defecto son de tipo var.

        Las vistas que definen dos métodos o señales con el mismo nombre en el mismo bloque de tipo provocarán errores. Sin embargo, podemos usar el nombre de un método existente para definir un nuevo método (esto hará que el método existente sea inutilizable)

        El siguiente tipo de rectángulo tiene un método CalculateHeight (), que se llama cuando se especifica el valor de altura.

         Si el método tiene parámetros, entonces podemos acceder a ellos por nombre de parámetro en el método. Por ejemplo, si se hace clic en MouseArea, se llamará al método moveTo (), y la nueva posición del texto se puede establecer usando newX y newY:

Atributos adicionales y SignalHandler
        adicionales Los atributos adicionales y los mecanismos de procesamiento de señal adicionales permiten que los objetos utilicen atributos externos y manejadores de señal a los que el objeto no hace referencia. Esto permite que los objetos accedan a esas propiedades y señales asociadas con un solo objeto.

         Una implementación de tipo QML puede optar por crear atributos y señales específicos adicionales. La creación de instancias de este tipo se crea en tiempo de ejecución, lo que permite que estos objetos accedan a propiedades y señales.

La sintaxis para hacer referencia a atributos y controladores adicionales es la siguiente:

        Por ejemplo, el tipo ListView tiene una propiedad adicional ListView.isCurrentItem, a la que puede acceder cualquier agente de ListView. Este atributo puede ser utilizado por cada objeto proxy independiente para determinar qué elemento está seleccionado actualmente:

        En este caso, el nombre del tipo adicional es ListView y la propiedad esCurrentItem, y se hace referencia a la propiedad adicional mediante ListView.isCurrentItem.

        Los manejadores de señal adicionales también pueden ser referenciados de esta manera. Por ejemplo, el controlador de señal adicional es Component.isCompleted, que se puede usar para ejecutar algún código JavaScript cuando se completa el proceso de creación del componente. En el siguiente ejemplo, una vez que ListModel esté completamente creado, el controlador de señal Component.onCompleted se ejecutará automáticamente:

         Los nombres de tipo adicionales son Componentes y señales completadas. A los manejadores de señales adicionales se les puede hacer referencia de esta manera: Componente.está Completo.

 [Notas sobre el acceso a atributos adicionales y al controlador de señal]

        Un error común es establecer propiedades adicionales y manejadores de señales para que sean accesibles directamente desde los subobjetos. Esto no es un problema Las instancias de tipos adicionales solo se agregan a objetos específicos, no el objeto y todos sus subobjetos.

       Por ejemplo: el siguiente ejemplo es una versión adaptada del ejemplo de atributo adicional anterior. En este caso, el agente es un Artículo, y el Rectángulo es el objeto hijo del Artículo:

        Esto no funciona como se esperaba, porque ListView.isCurrentItem solo se adjunta al objeto proxy raíz, no a sus hijos. Dado que Rectangle es un objeto secundario del agente, no el agente en sí, no puede usar ListView.isCurrentItem para acceder a propiedades adicionales de isCurrentItem. Por lo tanto, el rectángulo debe acceder a la propiedad isCurrentItem a través del objeto proxy raíz:

         Ahora es posible referirse correctamente a la propiedad adjunta isCurrentItem del delegado a través de delegateItem.ListView.isCurrentItem.

 
 

Wow
206 artículos originales publicados · 18 elogiados · 70,000 visitas

Supongo que te gusta

Origin blog.csdn.net/lvmengzou/article/details/105229820
Recomendado
Clasificación