En esta página

Parámetros del manejador de señales

Esta categoría de advertencia se escribe [signal-handler-parameters] por qmllint.

Esta categoría de advertencia tiene múltiples advertencias, descritas en las secciones siguientes:

No se ha encontrado el tipo de parámetro en la señal

¿Qué ha ocurrido?

Un manejador de señales intentó manejar una señal con parámetros de tipos QML desconocidos.

Normalmente, esto ocurre al manejar señales definidas en C++ en QML cuando el módulo con la señal definida en C++ no declara correctamente su dependencia QML de otro módulo QML. Si el módulo con la señal definida en C++ compila, es señal de que sólo se declaró una dependencia en el nivel de C++ y no en el nivel de módulo QML.

Nota: Si está importando módulos QML con dependencias externas, compruebe que están realmente instalados y que sus módulos terminan en una ruta de importación.

La advertencia también puede indicar que el tipo de parámetro de la señal definida en C++ no tiene un equivalente en QML. El tipo de parámetro podría carecer de la macro QML_ELEMENT, por ejemplo. Consulte Definición de tipos QML desde C++ o Visión general - Integración de QML y C++ en este caso.

¿Por qué es malo?

En el primer caso, el módulo con la señal C++ tiene una dependencia no declarada en el nivel de módulo QML, lo que dificulta el uso del módulo, ya que los usuarios del módulo tienen que adivinar las dependencias ocultas del módulo.

En ambos casos, las herramientas QML no son capaces de encontrar la contrapartida QML del tipo C++: el compilador no puede compilar este manejador de señales a C++ y qmllint, así como QML Language Server no pueden analizar este manejador.

Ejemplo

Supongamos que nuestro módulo tiene una clase C++ con una señal helloWorld:

#include <QQuickItem>
#include <QtQml/qqmlregistration.h>
#include <QObject>

class MyCppObject : public QObject
{
 Q_OBJECT
 QML_ELEMENT
public:
 MyCppObject(QObject *parent = nullptr)
     : QObject(parent)
 {}

signals:
 void helloWorld(QQuickItem *i);

};

con el siguiente CMakeLists.txt:

find_package(Qt6 6.5 REQUIRED COMPONENTS Quick QuickControls2)

qt_standard_project_setup(REQUIRES 6.5)

qt_add_executable(mymodule
 main.cpp
)

qt_add_qml_module(mymodule
    URI MyModule
    VERSION 1.0
    QML_FILES Main.qml
    SOURCES mycppobject.cpp mycppobject.h
)

# declare C++ dependency to Quick
target_link_libraries(appuntitled27
 PRIVATE Qt6::Quick
)

La dependencia C++ Quick fue declarada, de tal forma que esta clase puede compilar y el include QQuickItem puede ser encontrado. Además, mymodule no tiene ninguna dependencia QML en Qt Quick.

Ahora, vamos a intentar manejar esta señal helloWorld en QML:

import MyModule // name of the module with MyCppObject

MyCppObject {
    onHelloWorld: function (x) { console.log(x); } // not ok: Type QQuickItem was not found!
}

La razón del mensaje de advertencia es que en el código QML, QQuickItem y su contraparte QML Item no son conocidos: ¡la dependencia QtQuick de MyModule no fue declarada en el CMakeLists.txt!

Puedes añadirla como sigue en la llamada qt_add_qml_module():

qt_add_qml_module(mymodule
    URI MyModule
    ...
    # declare QML dependencies to QtQuick:
    DEPENDENCIES QtQuick
    ...
)

Ahora, ¡el código QML debería estar bien de nuevo!

El manejador de señales tiene más parámetros formales que la señal que maneja

¿Qué ocurre?

Un manejador de señales espera más parámetros de los que realmente proporcionará la señal.

¿Por qué es malo?

Los parámetros extra serán indefinidos.

Ejemplo

import QtQuick

Item {
    signal helloWorld(x: QtObject)  // signal expects only one parameter

    onHelloWorld: function (x,y,z) {} // not ok: signal handler handles three parameters
}

Para corregir esta advertencia, elimine los parámetros adicionales del manejador de señales o añada los parámetros que faltan a la declaración de la señal:

import QtQuick

Item {
    signal helloWorld(x: QtObject)  // signal expects only one parameter

    onHelloWorld: function (x) {} // ok: signal handler handles one parameter

    signal alternativeHelloWorld(x: QtObject, y: int, y: int)  // signal expects three parameters

    onAlternativeHelloWorld: function (x,y,z) {} // ok: signal handler handles three parameters
}

La señal tiene un parámetro con el mismo nombre

¿Qué ha ocurrido?

Es posible que la señal o el manejador de señales hayan intercambiado algunos de sus argumentos, o que falten algunos argumentos.

¿Por qué es malo?

Es muy probable que se trate de un error tipográfico no intencionado por el usuario.

Ejemplo

Argumentos que faltan

import QtQuick

Item {
    signal helloWorld(x: QtObject, y: int)

    onHelloWorld: function (y) {} // not ok: it seems that x was forgotten
}

Para corregir esta advertencia, añada los parámetros que faltan o cambie el nombre del primer parámetro:

import QtQuick

Item {
    signal helloWorld(x: QtObject, y: int)

    onHelloWorld: function (x, y) {} // ok: parameters have the same order as in helloWorld

    signal alternativeHelloWorld(x: QtObject, y: int)

    onAlternativeHelloWorld: function (x) {} // ok: parameters have the same order as in helloWorld, even if y is missing
}

Argumentos intercambiados

import QtQuick

Item {
    signal helloWorld(x: QtObject, y: int)

    onHelloWorld: function (y, x) {} // not ok: helloWorld expects first 'x' then 'y'
}

Para corregir esta advertencia, reordene los parámetros en el orden correcto:

import QtQuick

Item {
    signal helloWorld(x: QtObject, y: int)

    onHelloWorld: function (x, y) {} // ok: parameters have the same order as in helloWorld
}

Véase también qt_add_qml_module#declaring-module-dependencies.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.