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
이번 프로젝트에서는 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)
}
}
}
728x90
반응형
'Programming > QT&QML' 카테고리의 다른 글
[QT, QML] Pyside2 준비 (0) | 2020.05.04 |
---|---|
[QT, QML] MVC 패턴으로 구현 (0) | 2020.04.13 |
[QT, QML] Signal, Slot 동기(synchronous), 비동기(Asynchronous) ynchronous), 비동기(Asynchronous) 작업 (0) | 2020.04.12 |
[QT, QML] Signals Slots 사용하기 (0) | 2020.04.12 |
[QT, QML] QML Component anchor (0) | 2020.04.06 |