Signalhandler-Parameter

Diese Warnkategorie wird von qmllint mit [signal-handler-parameters] geschrieben.

Diese Warnkategorie hat mehrere Warnungen, die in den folgenden Abschnitten beschrieben werden:

Typ des Parameters im Signal wurde nicht gefunden

Was ist passiert?

Ein Signal-Handler hat versucht, ein Signal mit Parametern unbekannter QML-Typen zu behandeln.

Normalerweise passiert dies bei der Behandlung von C++ definierten Signalen in QML, wenn das Modul mit dem C++ definierten Signal seine QML-Abhängigkeit von einem anderen QML-Modul nicht richtig deklariert. Wenn das Modul mit dem in C++ definierten Signal kompiliert werden kann, ist dies ein Zeichen dafür, dass eine Abhängigkeit nur auf der C++-Ebene und nicht auf der Ebene des QML-Moduls deklariert wurde.

Hinweis: Wenn Sie QML-Module mit externen Abhängigkeiten importieren, vergewissern Sie sich, dass diese tatsächlich installiert sind und dass ihre Module in einem Importpfad landen.

Die Warnung kann auch darauf hinweisen, dass der Parametertyp des in C++ definierten Signals kein QML-Gegenstück hat. Dem Parametertyp könnte z. B. das Makro QML_ELEMENT fehlen. Siehe in diesem Fall Definieren von QML-Typen aus C++ oder Übersicht - Integration von QML und C++.

Warum ist das schlecht?

Im ersten Fall hat das Modul mit dem C++-Signal eine nicht deklarierte Abhängigkeit auf der QML-Modulebene, was die Verwendung des Moduls erschwert, da die Benutzer des Moduls die versteckten Abhängigkeiten des Moduls erraten müssen.

In beiden Fällen ist das QML-Tooling nicht in der Lage, das QML-Gegenstück des C++-Typs zu finden: der Compiler kann diesen Signal-Handler nicht nach C++ kompilieren und qmllint sowie QML Language Server kann diesen Handler nicht analysieren.

Beispiel

Unser Modul soll eine C++ Klasse mit einem helloWorld Signal haben:

#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);

};

mit folgender 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
)

Die C++-Abhängigkeit Quick wurde deklariert, so dass diese Klasse kompiliert werden kann und das QQuickItem Include gefunden werden kann. Außerdem hat mymodule keine Abhängigkeit von QtQuick.

Versuchen wir nun, dieses helloWorld Signal in QML zu verarbeiten:

import MyModule // name of the module with MyCppObject

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

Der Grund für die Warnmeldung ist, dass im QML-Code QQuickItem und sein QML-Gegenstück Item nicht bekannt sind: die Abhängigkeit 'QtQuick' von MyModule wurde nicht in der CMakeLists.txt deklariert!

Sie können sie wie folgt im Aufruf qt_add_qml_module() hinzufügen:

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

Jetzt sollte der QML-Code wieder funktionieren!

Signal-Handler hat mehr formale Parameter als das Signal, das er behandelt

Was ist passiert?

Ein Signal-Handler erwartet mehr Parameter als das Signal tatsächlich bereitstellt.

Warum ist das schlecht?

Die zusätzlichen Parameter werden undefiniert sein.

Beispiel

import QtQuick

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

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

Um diese Warnung zu beheben, entfernen Sie die zusätzlichen Parameter des Signal-Handlers oder fügen Sie die fehlenden Parameter in die Deklaration des Signals ein:

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
}

Das Signal hat einen Parameter mit demselben Namen

Was ist passiert?

Das Signal oder der Signal-Handler könnte einige seiner Argumente vertauscht haben, oder einige Argumente könnten fehlen.

Warum ist das schlecht?

Es handelt sich höchstwahrscheinlich um einen Tippfehler und ist nicht vom Benutzer beabsichtigt.

Beispiel

Fehlende Argumente

import QtQuick

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

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

Um diese Warnung zu beheben, fügen Sie die fehlenden Parameter hinzu oder benennen Sie den ersten Parameter um:

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
}

Vertauschte Argumente

import QtQuick

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

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

Um diese Warnung zu beheben, ordnen Sie die Parameter in der richtigen Reihenfolge neu an:

import QtQuick

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

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

Siehe auch qt_add_qml_module#declaring-module-dependencies.

© 2025 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.