2014-11-18 5 views
1

enumPython에서 QML 인스턴스로 내보낼 수 있습니까? PyQt5 && QML 내보내기 QUM

class UpdateState(): 
    Nothing = 0 
    CheckingUpdate = 1 
    NoGameFound = 2 
    Updating = 3 

어떻게 qml에서 사용하려면 : 그것은 오래 열거가 Q_ENUMS에 등록하고, QML 엔진에 등록 된 클래스 내부에 정의 된대로 잘 작동

import PythonController 1.0 

PythonController { 
    id: controller 
} 

Item { 
    visible: controller.UpdateState.Nothing ? true : false 
} 
+0

'파이썬'이'Qt'와 어떻게 작동하는지 모르겠지만'C++'에서는'Q_ENUMS'을 사용하여 열거 형을 내보낼 수 있습니다. Python-QML은 enum을 메타 객체 시스템으로 내보낼 수있는 비슷한 기능을 가지고있을 수 있습니까? – folibis

+1

PyQt5에는 [QtCore.Q_ENUMS] (http://pyqt.sourceforge.net/Docs/PyQt5/metaobjects.html)이 있습니다. PyQt4도 가지고 있지만, 같은 방식으로 작동하지 않는 것으로 보이며, AFAICS는 문서화되어 있지 않습니다. – ekhumoro

답변

0

.

example.py

from sys import exit, argv 

from PyQt5.QtCore import pyqtSignal, pyqtProperty, Q_ENUMS, QObject 
from PyQt5.QtQml import QQmlApplicationEngine, qmlRegisterType 
from PyQt5.QtGui import QGuiApplication 


class Switch(QObject): 

    class State: 
     On = 0 
     Off = 1 

    Q_ENUMS(State) 

    stateChanged = pyqtSignal(State, arguments=['state']) 

    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     self._state = Switch.State.Off 

    @pyqtProperty(State, notify=stateChanged) 
    def state(self): 
     return self._state 

    @state.setter 
    def state(self, state): 
     if state != self._state: 
      self._state = state 
      self.stateChanged.emit(self._state) 


app = None 


def main(): 
    global app 

    app = QGuiApplication(argv) 

    qmlRegisterType(Switch, 'Switch', 1, 0, 'Switch') 

    engine = QQmlApplicationEngine() 
    engine.load('example.qml') 

    exit(app.exec_()) 


if __name__ == '__main__': 
    main() 

example.qml하는 데 도움이

import QtQuick 2.0 
import QtQuick.Window 2.0 

import Switch 1.0 

Window { 
    title: 'QML Enum Example' 
    visible: true 
    width: 400 
    height: 400 

    color: colorSwitch.state === Switch.On ? "green" : "red" 

    Switch { 
     id: colorSwitch 
     state: Switch.Off 
    } 

    Text { 
     text: "Press window to switch state" 
    } 

    MouseArea { 
     anchors.fill: parent 

     onClicked: { 
      if (colorSwitch.state === Switch.Off) 
       colorSwitch.state = Switch.On 
      else 
       colorSwitch.state = Switch.Off 
     } 
    } 
} 

희망 : 여기에 작은 예입니다.

관련 문제