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.