[英]PySide2 with qml as ui
我正在使用pyqt5和pyside2來處理qtquick2控件,即使pySide2聲稱它們是pyQt語法和邏輯,但並非總是如此,而且pySide2文檔要么嚴重過時,要么根本不准確。 (我確實意識到pySide2還沒有准備好正確使用,但是我仍然會嘗試擺脫它)
例如插槽使用我確實得到pyQt5
@pyqtSlot()
def sayHi(self):
print("Hi")
pySide2
@Slot()
def sayHi(self):
print("Hi")
然后僅從myQml調用該函數即可。
但是我需要替代品:
@pyqtProperty(float, notify=currentValueChanged)
@currentValue.setter
variableX =pyqtSignal()
最后一個實際的代碼:
import sys
import os
from PyQt5.QtCore import QObject, QUrl, Qt, pyqtSlot, pyqtSignal, pyqtProperty
from PyQt5.QtWidgets import QApplication
from PyQt5.QtQml import QQmlApplicationEngine
class Manager(QObject):
#slider Value
currentValueChanged = pyqtSignal()
def __init__(self):
QObject.__init__(self)
self.m_currentValue =0
#slider
self.currentValueChanged.connect(self.on_currentValueChanged)
#slide stuff
@pyqtProperty(float, notify=currentValueChanged)
def currentValue(self):
return self.m_currentValue
#slider
@currentValue.setter
def currentValue(self, val):
if self.m_currentValue == val:
return
self.m_currentValue = val
self.currentValueChanged.emit()
#slider VOlUME CHANGED <<<<<<<<<<<<<<<<<<<<<<<<< WORKS>>>>>>>>>>>>>>>>>>>>>>
@pyqtSlot()
def on_currentValueChanged(self):
print(self.m_currentValue)
if __name__ == "__main__":
os.environ["QT_QUICK_CONTROLS_STYLE"] = "Material"
app = QApplication(sys.argv)
engine = QQmlApplicationEngine()
manager = Manager()
ctx = engine.rootContext()
ctx.setContextProperty("Manager", manager)
engine.load('main.qml')
if not engine.rootObjects():
sys.exit(-1)
sys.exit(app.exec_())
QML
import QtQuick 2.10
import QtQuick.Controls 2.1
import QtQuick.Window 2.2
import QtQuick.Controls.Material 2.3
ApplicationWindow {
id: applicationWindow
Material.theme: Material.Light
title: qsTr("Test Invoke")
visible: true
width: 600
height: 500
Slider {
id: slider
x: 160
y: 311
value: 0.5
property bool updateValueWhileDragging: true
onMoved: Manager.currentValue = value
}
}
例如,上面的代碼使用pyQT5和qtQuick2在滑塊移動時僅打印出滑塊的值。
有沒有辦法用pySide2來實現這一點,我嘗試了一些選項,並且我可以在pySide中進行簡單的按鈕單擊,但是,對於pySide中的屬性和設置器,我沒有發現任何有價值的信息。 (好吧,我發現的東西已經過時了,而且對於qtQuick1也是如此)
如果有人給我一個可行的例子,或指出我某個地方,我將非常感激! 干杯
對於PySide2
它具有相同的PySide
命名法,因此我建議您檢查以下鏈接 。
對於PySide,您必須使用類似於pyqtProperty的Property,Slot等於pyqtSlot,Signal等於pyqtSignal。
import sys
import os
from PySide2.QtCore import Qt, QObject, Signal, Slot, Property
from PySide2.QtGui import QGuiApplication
from PySide2.QtQml import QQmlApplicationEngine
class Manager(QObject):
currentValueChanged = Signal()
def __init__(self):
QObject.__init__(self)
self.m_currentValue = 0.0
self.currentValueChanged.connect(self.on_currentValueChanged)
@Property(float, notify=currentValueChanged)
def currentValue(self):
return self.m_currentValue
@currentValue.setter
def setCurrentValue(self, val):
if self.m_currentValue == val:
return
self.m_currentValue = val
self.currentValueChanged.emit()
@Slot()
def on_currentValueChanged(self):
print(self.m_currentValue)
if __name__ == "__main__":
os.environ["QT_QUICK_CONTROLS_STYLE"] = "Material"
app = QGuiApplication(sys.argv)
engine = QQmlApplicationEngine()
manager = Manager()
ctx = engine.rootContext()
ctx.setContextProperty("Manager", manager)
engine.load('main.qml')
if not engine.rootObjects():
sys.exit(-1)
sys.exit(app.exec_())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.