신호 처리기 매개변수
이 경고 카테고리의 철자는 [signal-handler-parameters]
입니다.
이 경고 카테고리에는 아래 섹션에 설명된 여러 경고가 있습니다:
신호의 매개 변수 유형을 찾을 수 없습니다.
무슨 일이 일어났나요?
신호 처리기가 알 수 없는 QML 유형의 매개변수가 있는 신호를 처리하려고 했습니다.
일반적으로 이 문제는 C++ 정의 신호가 있는 모듈이 다른 QML 모듈에 대한 QML 종속성을 제대로 선언하지 않은 경우 QML에서 C++ 정의 신호를 처리할 때 발생합니다. C++ 정의 신호가 있는 모듈이 컴파일되면 이는 종속성이 C++ 수준에서만 선언되고 QML 모듈 수준에서는 선언되지 않았다는 신호입니다.
참고: 외부 종속성이 있는 QML 모듈을 임포트하는 경우 해당 모듈이 실제로 설치되어 있는지, 그리고 해당 모듈이 임포트 경로에 있는지 확인하세요.
이 경고는 C++ 정의 신호의 매개변수 유형에 QML 대응하는 유형이 없다는 것을 나타낼 수도 있습니다. 예를 들어 매개변수 유형에 QML_ELEMENT 매크로가 누락되어 있을 수 있습니다. 이 경우 C++에서 QML 유형 정의하기 또는 개요 - QML 및 C++ 통합을 참조하세요.
왜 이런 문제가 발생하나요?
첫 번째 경우에는 C++ 신호가 있는 모듈에 QML 모듈 수준에서 선언되지 않은 종속성이 있으므로 모듈 사용자가 모듈의 숨겨진 종속성을 추측해야 하므로 모듈을 사용하기가 어렵습니다.
두 경우 모두, 컴파일러가 이 신호 처리기를 C++로 컴파일할 수 없을 뿐만 아니라, QML 툴링이 C++ 유형의 QML 대응을 찾을 수 없고 QML Language Server 는 이 핸들러를 분석할 수 없습니다.
예제
모듈에 helloWorld
신호가 하나 있는 C++ 클래스가 있다고 가정해 봅시다:
#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); };
다음과 같은 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 )
C++ 종속성 Quick
이 클래스가 컴파일될 수 있고 QQuickItem include를 찾을 수 있도록 선언되었습니다. 또한 내 모듈에는 QtQuick 에 대한 의존성이 없습니다.
이제 QML에서 이 helloWorld
신호를 처리해 보겠습니다:
import MyModule // name of the module with MyCppObject MyCppObject { onHelloWorld: function (x) { console.log(x); } // not ok: Type QQuickItem was not found! }
경고 메시지가 표시되는 이유는 QML 코드에서 QQuickItem
와 그 QML 대응하는 Item
을 알 수 없기 때문입니다: MyModule의 의존성 'QtQuick' 이 CMakeLists.txt에 선언되지 않았기 때문입니다!
qt_add_qml_module() 호출에서 다음과 같이 추가할 수 있습니다:
qt_add_qml_module(mymodule URI MyModule ... # declare QML dependencies to QtQuick: DEPENDENCIES QtQuick ... )
이제 QML 코드가 다시 정상적으로 작동합니다!
시그널 핸들러가 처리하는 시그널보다 더 많은 공식적인 파라미터를 가짐
무슨 일이 일어났을까요?
신호 핸들러가 신호가 실제로 제공하는 것보다 더 많은 매개변수를 기대합니다.
이것이 왜 나쁜가요?
추가 매개변수가 정의되지 않았기 때문입니다.
예시
import QtQuick Item { signal helloWorld(x: QtObject) // signal expects only one parameter onHelloWorld: function (x,y,z) {} // not ok: signal handler handles three parameters }
이 경고를 해결하려면 신호 처리기의 추가 매개변수를 제거하거나 누락된 매개변수를 신호 선언에 추가하세요:
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 }
신호에 같은 이름의 매개 변수가 있습니다.
무슨 일이 있었나요?
신호 또는 신호 처리기가 일부 인수를 바꿨거나 일부 인수가 누락되었을 수 있습니다.
이것이 왜 나쁜가요?
사용자가 의도하지 않은 오타일 가능성이 높습니다.
예시
누락된 인수
import QtQuick Item { signal helloWorld(x: QtObject, y: int) onHelloWorld: function (y) {} // not ok: it seems that x was forgotten }
이 경고를 수정하려면 누락된 인수를 추가하거나 첫 번째 인수의 이름을 바꾸세요:
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 }
바뀐 인수
import QtQuick Item { signal helloWorld(x: QtObject, y: int) onHelloWorld: function (y, x) {} // not ok: helloWorld expects first 'x' then 'y' }
이 경고를 수정하려면 매개변수를 올바른 순서로 다시 정렬하세요:
import QtQuick Item { signal helloWorld(x: QtObject, y: int) onHelloWorld: function (x, y) {} // ok: parameters have the same order as in helloWorld }
© 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.