본문 바로가기

Programming/QT&QML

[QT, QML] Python에서 Property 등록

728x90
반응형
# Python : 3.8.2
# pip : 19.2.3
# pyside2 : 5.14.2.1
# Project name : pyside2_qml_property

https://github.com/jungmonster/qt_study_project/tree/master/projects

 

jungmonster/qt_study_project

Qt projects for my study. Contribute to jungmonster/qt_study_project development by creating an account on GitHub.

github.com

 

이번 프로젝트에서는 python에서 signal, slot을 활용한 property를 하나 만들어서 QML에서 제어할 수 있도록 작업했다.

우선 결과물은 아래와 처럼 QML에 Button과 Text를 선언하고 버튼 누르면 카운트가 올라가도록 작업했다.

먼저 Property를 등록 할 class를 하나 만든다.

class Number(QObject):
    __val = 0
    @Signal
    def numberChanged(self):
        pass

    @Slot(int)
    def set_number(self, val):
        print("setter func")
        self.__val = val
        self.numberChanged.emit()

    def get_number(self):
        print("getter func")
        return self.__val

    ValueNumber = Property(int, get_number, set_number, notify=numberChanged)

위의 코드에서 getter, setter(slots) signal 함수를 만들고 ValueNumber = Property(int, get_number, set_number, notify=numberChanged) 에서 type부터 getter, setter, notify를 등록 하는 것을 볼 수 있다.

python full source는 아래와 같다.
Number class를 numberVal로 등록했다.

import sys
from PySide2.QtGui import QGuiApplication
from PySide2.QtQml import QQmlApplicationEngine
from PySide2.QtCore import QUrl
from PySide2.QtCore import QCoreApplication
from PySide2.QtCore import QObject, Signal, Slot, Property

class Number(QObject):
    __val = 0
    @Signal
    def numberChanged(self):
        pass

    @Slot(int)
    def set_number(self, val):
        print("setter func")
        self.__val = val
        self.numberChanged.emit()

    def get_number(self):
        print("getter func")
        return self.__val

    ValueNumber = Property(int, get_number, set_number, notify=numberChanged)

if __name__ == '__main__':  
    app = QGuiApplication(sys.argv)
    engine = QQmlApplicationEngine()

    number = Number()
    engine.rootContext().setContextProperty("numberVal", number)

    engine.load(QUrl("./main.qml"))

    if not engine.rootObjects():
        sys.exit(-1)

    sys.exit(app.exec_())

QML은 아래와 같이 심플 하게 작성한다.

import QtQuick 2.0
import QtQuick.Window 2.0
import QtQuick.Controls 2.0

Window {
    id: root

    width: 640
    height: 480
    visible: true
    title: "Hello Python World!"

    property int count: 0

    Text{
        x : 50
        y : 100
        text : "number : " + numberVal.ValueNumber
    }

    Button {
        x : 50
        y : 150
        text: "button"
        onClicked: {
            count = count + 1
            numberVal.set_number(count)
        }
    }
}
반응형