Qt 2011 Developer Dasy 세미나 자료
Qt Quick Best Practices and Design Patterns
( ftp://ftp.informatik.hu-berlin.de/pub/Linux/Qt/QT/videos/DevDays2011/TechnicalSessions/DevDays2011_-_Qt_Quick_Best_Practices_And_Design_Patterns.pdf )
by Girish Ramakrishnan
2011년 Qt 개발자 데이 세미나 발표자료이다.
큰 QML Application을 디자인 하는 최고의 방법과 다양한 QML 트릭 및 덜 알려진 특징들에 대해 발표한다고 써있다.
PDF만 있고 설명이 없어 전부 이해하는데는 한계가 있지만 몇 가지를 소개한다.
Don't have multiple signals with same name but different
signature since QML can only connect to the last one
• Avoid QVariant properties
– Being specific allows QML do faster type coercion
QML은 마지막만 연결할 수 있기 때무에 서로 다른 객체에서 동일한 이름의 signal을 사용하지 말라는 말.
QT의 C++ 모드는 서로다른 객체에서 도일한 signal을 사용 할 수 있다. QML도 가능 한 걸로 알고 있는데 테스트 해봐야 겠다.
QML에서 QVariant properties를 사용하지 말라는 뜻이다. QML에는 QVariant type의 property는 없다.
'property var test:XXXX' 이걸 뜻하는 것 같은데 var type을 사용하면 아무래도 속도에 영향을 끼칠 수는 있겠지만 미미한 것 같다.
• Code structure
– id
– property declarations
– signal declarations
– JavaScript functions
– object properties
– child objects
– states
– transitions
QML 은 생긴지 아직 오래된 것이 아니라 그럴듯한 코딩 스타일, 디자인 패턴 등이 정립되지 않았다. 'Code structure'는 QML 객체를 선언할 때 객체를 어떤 순서로 선언할지에 대한 정의이다.
맨처음 id를 정의하고 객체의 기본 property를 선언한다.
그 다음으로 객체에서 사용할 signal과 JavaScript 함수를 정의한다.
그 후에 객체에서 사용할 사용자 정의 property( object property )를 선언한다고 하는데 내 경우 property declarations 다음에 사용자 정의 property를 선언한다. 즉 변수는 변수 끼리 모아둔다.
자식 객체를 선언한 후 states와 transitions를 선언하는 순서이다.
내 방식대로 선언한다고 하면
• Code structure
– id
– property declarations
– object properties
– signal declarations
– JavaScript functions
– child objects
– states
– transitions
순서이다.
Javascript design
• Use “.pragma library” for shared libraries
• Qt.include can import other Js files
• Global code runs in limited scope
– var x = qmlItem.foo // won't work
• JS를 QML에서 라이브러리로 사용할 때는 파일 맨 상단에 '.pragma library' 라고 선언하는게 좋다.( 딱히 선언안해도사용하는데는 아무 문제가 없더라 )
• JS 파일에서 다른 JS파일을 Import할 때는 'import' 키워드가 아니라 'Qt.include("XXXX.js")' 를 사용해야 한다.
• JS는( QML도 마찬가지로 ) 제한된 Scope를 가진다. Global code라고 해서 모든 Scope에서 실행되는 것은 아니다 . (QML Scope는 JS의 Scope에 영향을 받는다. QML Scope에 대해 따로 정리할 계획이다.)
• var 타입 변수가 아무리 전지전능해도 QML Item의 property를 할당 할 수는 없다.( 이 경우는 JS 파일안에 선언된 var 타입의 경우이다. JS 파일안에서는 QML 객체를 만들 수가 없기 때문이다. QML 객체 안에서 property로 선언된 var 타입의 property는 가능하다. )