한국어 English

PySide에서 정의한 상수를 QML에서 사용하기

이번 PySide 튜터리얼에서는 상수를 (계층적으로) 정의하고 이것을 QML에서 사용할 수 있도록 설정하는 방법에 대해 설명하겠습니다. 이러한 방법을 이용하면 파이썬 스크립트 안에서 간단히 상수를 수정하는 것만으로 전체 UI(특히 터치 관련 설정치)에 곧바로 적용시키는 것이 가능합니다. 이 방법은 단순히 파이썬의 딕셔너리 타입을 이용하기 때문에 상수 설정에 복잡한 코드를 넣는 것도 가능합니다. 여기에 나와 있는 예제는 값을 동적으로 바꿔서 프로그램에 곧바로 반영시키는 구조는 가지고 있지 않으며 초기에 단 한 번 설정한 후에는 값을 바꿔도 UI에 다시 적용되지 않습니다. (만약 값을 동적으로 바꿔서 적용시키고 싶다면, QObject를 상속받아 NOTIFY가 가능한 프로퍼티를 이용해야 합니다.)

Constants.py

필요한 모듈을 임포트

커맨드 라인 파라미터를 참조하고, 올바른 Exit상태를 받기 위해서는 sys 모듈을 임포트합니다. 또한 UI관련 처리를 위해 QtCore, QtGui, QtDeclarative를 임포트합니다 :

  1. import sys
  2.  
  3. from PySide import QtCore
  4. from PySide import QtGui
  5. from PySide import QtDeclarative

파이썬의 dict 타입으로 상수(constant)를 정의

간단히 딕셔너리를 하나 만듭니다 – 기본 데이터 타입(str, float, int, bool 등)만을 사용할 수 있으며, 내 부에 딕셔너리(dict)나 리스트(list)도 넣을 수 있습니다 :

  1. Constants = {
  2.     'CustomText': "Hey PySide!",
  3.     'FontSize': 9.24,
  4.     'Colors': {
  5.         'Background': "#8ac852",
  6.         'Foreground': "#00672a",
  7.     },
  8.     'BoldText': True,
  9.     'Items': {
  10.         'Count': 7,
  11.         'Suffixes': ['A', 'B', 'C', 'D', 'E', 'F', 'G'],
  12.     },
  13.     'Step': { 'X': 5, 'Y': 10 },
  14. }

QApplication과 QDeclarativeView를 생성

간단히 QApplication를 생성하고 커맨드 라인 파라미터를 생성자의 인자로 넣습니다. 그 다음, QDeclarativeView를 생성하고, 어플리케이션의 윈도우 사이즈가 변경되었을 때 자동적으로 QML의 루트 오브젝트의 사이즈도 변경되도록 설정합니다 :

  1. app = QtGui.QApplication(sys.argv)
  2.  
  3. view = QtDeclarative.QDeclarativeView()
  4. view.setResizeMode(QtDeclarative.QDeclarativeView.SizeRootObjectToView)

context property 에 상수를 등록

rootContext() 를 호출하여 QML 엔진의 root context의 인스턴스를 얻은 다음, setContextProperty 를 통해 QML 쪽에서도 Python의 상수에 접근 가능하도록 설정합니다 :

  1. ctx = view.rootContext()
  2. ctx.setContextProperty('C', Constants)

QML 파일을 로드, 윈도우를 표시, 어플리케이션을 실행

QML 파일이 같은 디렉토리에 있다면 단순히 view의 setSource 를 호출할 때 파일 이름을 넘겨주기만 하면 됩니다. 그 다음, 윈도우가 화면에 표시되도록 show() 를 호출합니다. 마지막으로 QApplication 인스턴스의 exec_() 를 호출하여 어플리케이션을 실행시킵니다.

  1. view.setSource('Constants.qml')
  2. view.show()
  3.  
  4. sys.exit(app.exec_())

Constants.qml

이제 QML 쪽에서는 “C“라는 이름의 context property에 접근 가능합니다. 물론 멤버의 하부 계층의 변수에도 접근가능하며, 딕셔너리나 리스트도 이용할 수 있습니다( C.Items.Count , C.Items.Suffixes[index] ). 물론 명심해야 할 것은, 이번 예제는 동적으로 값을 바꿔도 아무 변화도 일어나지 않는다는 것입니다(실행 중에 배경색을 바꾼다거나 하는 등).

  1. import Qt 4.7
  2.  
  3. Rectangle {
  4.     width: 400
  5.     height: 400
  6.     color: C.Colors.Background
  7.  
  8.     Repeater {
  9.         model: C.Items.Count
  10.  
  11.         Text {
  12.             y: index * C.Step.Y
  13.             x: index * C.Step.X
  14.             color: C.Colors.Foreground
  15.             font.bold: C.BoldText
  16.             font.pointSize: C.FontSize
  17.             text: C.CustomText + C.Items.Suffixes[index]
  18.         }
  19.     }
  20. }

실행된 모습

python Constants.py 를 입력하여 어플리케이션을 실행시키면 아래와 같은 모습이 나타납니다.

Screenshot of example application

Categories:

  • Tutorial
  • LanguageBindings
  • PySide Korean
  • snippets
  •