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 | 86884 |
8 |
ShaderEffect QML Type 을 이용한 그래픽효과
![]() | makersweb | 2018.12.09 | 2201 |
7 |
Qml에서 커튼효과 구현 예제 - Shader Effects
![]() | 운영자 | 2018.12.05 | 1175 |
6 |
QML에서 동적으로 텍스트 다국어 처리
![]() | makersweb | 2018.11.04 | 4298 |
5 |
Qml에서 키보드 입력 이벤트 핸들링
![]() | makersweb | 2018.08.09 | 3700 |
4 | Qml 및 C++개발시 유용한 팁 [3] | makersweb | 2018.04.06 | 6119 |
3 | QML에서 undefined를 확인하는 방법 | makersweb | 2017.11.29 | 1546 |
2 |
Qml 사용자 ScrollBar 구현
![]() | makersweb | 2015.07.24 | 6275 |
1 | z-order 를 컨트롤 하기위한 방법 | makersweb | 2015.05.13 | 6657 |