본문 바로가기
C++ 200제/코딩 IT 정보

Qt QML - Cannot override FINAL property 에러 해결

by vicddory 2018. 9. 6.

Qt QML - Cannot override FINAL property 에러 해결


Qt QML 에러 메시지

Qt QML - Cannot override FINAL property


분명히 외부에 선언된 Item에서 가져온 요소들을 사용하는 데, override를 할 수 없다는 에러 메시지가 뜬다.


현재로썬, Qt QML의 버그라는 판단이 선다. 외국 블로거의 글들을 찾아봐도 이해할 수 없다는 의견이 주를 이룬다. 나도 이해가 되질 않는 에러이기도 하다.


우선은 내가 이 에러 메시지를 보게 된 경위를 살펴본다.

나는 Item 요소를 외부에 선언하고 해당 property를 불러와 사용하려 했다.

그러나 제목에도 보이는 "Cannot override FINAL property"라는 메시지가 나를 만나러 와버렸다.


1
2
3
4
5
6
Item{
    id: icon_information
 
    property int width: 70
    property int height: 70
}
cs


위처럼 Item을 선언하고 내부엔 width와 height란 int형 프로퍼티를 선언했다.


그리고 아래처럼 해당 프로퍼티를 사용했다.


1
2
3
4
5
6
Image {
    width: icon_information.width
    height: icon_information.height
 
    source:"blabla~~"
}
cs


결과는 좋지 않았다.


Qt Creator 아웃풋 창에서 Qt QML 에러 메시지를 본 것이다.


Qt QML - Cannot override FINAL property 에러 해결[Qt QML - Cannot override FINAL property 에러 해결]


이해가 잘 되질 않았다. 어떤 문제인지 파악이 되지 않았다고나 할까...


에러 메시지와 프로퍼티의 이름을 놓고 생각해 봤을 때, 나로선 컴파일러가 Image 태그의 width를 재정의하려다 실패했다고 이해할 수밖에 없었다.


물론, 나는 재정의를 의도한 것이 아니라 width에 값을 할당하려는 시도였을 뿐이다. 거창한 override 작업이 아니었다.


아마도 이름이 같다 보니 생긴 일종의 버그란 생각이 든다. (물론 내가 QML을 제대로 이해하지 못했을 가능성도 크다)


그래서 아래처럼 프로퍼티의 이름을 변경했다.


1
2
3
4
5
6
Item{
    id: icon_information
 
    property int icon_width: 70
    property int icon_height: 70
}
cs


width와 height 앞에 icon_을 붙여 Qt QML에 새로운 프로퍼티 이름을 할당했다.


이것으로 에러는 해결된다. "Cannot override FINAL property"란 메시지는 안 보인다.

근데, 에러 해결은 되었지만 내가 QML을 제대로 이해하지 못했다는 찝찝함 때문에 관련 에러에 대한 정보 포스트를 더 찾아봤다. 그리고 괜찮은 예제를 하나 찾았다.



위 포스트의 작성자는 TextInput를 하나 선언하고 그 안에 텍스트와 마우스 커서를 놓으려 했다.


그러나 TextInput와 focus를 재정의 할 수 없다는 에러를 만나게 되었다. (cannot override) 이 에러를 해결하기 위해 LineInput을 하나 더 선언하고 alias(참조) 속성을 갖는 프로퍼티도 하나 추가했다.


이 경우도 역시 마찬가지지만, 코드 작성자는 재정의를 시도한 게 아니라 단순히 값을 할당하는 시도를 했다가 컴파일러의 에러 메시지를 보게 된 것이다.


내 경우엔 프로퍼티 이름을 변경해 해결할 수 있었지만, 그 방법이 여의치 않을 땐 아래처럼 참조 속성이 부여된 프로퍼티를 이용할 수도 있다.


qt, Cannot override FINAL property[Qt QML - Cannot override FINAL property 에러 해결]


전체 소스말고 일부만 살펴보자.


1
2
3
4
5
6
LineInput {
    anchors.centerIn: parent
    width: 140
    text: "My LineEdit"
    focus: true
}
cs


TextInput에 들어갈 LineInput을 하나 선언한다.


1
property alias input: input
cs


참조 속성이 부여된 프로퍼티도 하나 선언한다.


1
2
3
4
5
6
7
LineInput {
    anchors.centerIn: parent
    width: 140
    focus: true
    input.text: "No Way" // normal
    //text: "No Way"     // abnormal
}
cs


최종적으론 LineInput의 텍스트를 직접 변경하는 게 아니라 참조를 통한 텍스트 변경을 시도한다.


이러면 정상적으로 수행된다. focus도 잘 적용되고. 내가 QML을 접한 지 오래되지 않아 능숙하지 않기도 하지만, 사실 이런 에러는 많이 당황스럽다. 분명하게 구분된 프로퍼티 조차도 오버라이드의 요소로 받아들인다는 것이 아주 낯설다.


역시, Markup Language는 어렵다. 학교 다닐 때도 XML 힘들게 배웠었는데, QML도 마찬가지네.


Qt QML - Cannot override FINAL property 에러 해결