Qt Quick 응용프로그램에서는 일반적으로 QML "프론트엔드"와 함께 C++ 백엔드를 구현하여 개발한다. C++ 백엔드는 QML엔진의 rootContext()
를 통해 QML 계층에 노출되는 QObject 의 파생 클래스이다.
main.cpp
// Create instance of MyItem.
MyItem myitem;
engine.rootContext()->setContextProperty("myItem", &myitem);
main.qml
SomeItem {
property string name: myItem.name // myItem의 속성을 바인딩.
}
애플리케이션을 종료할 때 흔히 바인딩오류를 발견할 수 있다. 애플리케이션이 완전히 종료하기 전에 백엔드가 이미 파괴되었기 때문에 QML 엔진에서 바인딩 오류가 발생한다는 것이다. 그 이유는 QML 엔진이 백엔드가 있을 것으로 기대하면서 백엔드보다 오래 지속되기 때문이다.
다음은 출력에서 가져온 에러 메세지이다.
qrc:/main.qml:13: TypeError: Cannot read property 'name' of null
이에 대한 두 가지 해결 방법이 있다. 한 가지 방법은 백엔드가 QML 엔진보다 먼저 생성되어 백엔드 객체가 마지막으로, 또는 적어도 엔진 이후에 자체적으로 소멸되도록 하는 것이다.
// QML 엔진 이전에 구축된 MyItem.
MyItem myitem;
QQmlApplicationEngine engine;
다른 방법은 힙에 백엔드를 만들고 다음과 같이 엔진을 부모로 설정하는 것이다. 이것은 엔진이 파괴될 때 백엔드도 파괴된다는 것을 의미한다.
QQmlApplicationEngine engine;
// Create instance of MyItem.
auto myitem = new MyItem(&engine);
첫 번째 방법이 더 간단하고 스택에서 직접 객체를 생성한다고 생각한다. 다만 순서를 조정하는게 간단하면서도 실수하여 버그가 생기기 쉽다. 두 번째 옵션은 실수로 순서를 변경할 수 없다는 점에서 더 강력하다(엔진이 존재하지 않는 한 백엔드를 선언할 수 없음).
애플리케이션이 이미 종료되고 있기 때문에 오류 자체는 무해하지만 그럼에도 불구하고 존재해서는 안 되는 오류이다.
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
공지 | Qt프로그래밍(QtQuick) Beginner를 위한 글 읽는 순서 | 운영자 | 2019.01.05 | 86620 |
8 |
QML에서 Websocket 서버와 통신
![]() | makersweb | 2021.09.18 | 852 |
7 |
QML에서 D-Bus 통신
![]() | makersweb | 2023.03.15 | 760 |
6 |
OpacityMask 예제
![]() | makersweb | 2023.01.26 | 706 |
5 | QML과 코루틴(Coroutines) | makersweb | 2020.11.03 | 586 |
4 | QtQuick 애플리케이션에 Rive 애니메이션 통합 | makersweb | 2024.03.31 | 547 |
» | 앱을 종료할 때 QML 바인딩 오류를 피하는 방법 | makersweb | 2021.08.08 | 509 |
2 | Binding 타입으로 객체 속성 간 묶기 | makersweb | 2022.03.04 | 438 |
1 | 그래픽 소프트웨어에서 디자인 내보내기 (Exporting Designs from Graphics Software) | j2doll | 2020.12.25 | 417 |