gpt4 book ai didi

python - PySide2 与 qml 作为 ui

转载 作者:行者123 更新时间:2023-11-30 22:15:52 29 4
gpt4 key购买 nike

我正在使用 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 在移动 slider 时打印出 slider 的值。

有没有办法用 pySide2 来实现这个,我尝试了一些选项,并且我可以在 pySide 中进行简单的按钮单击,但是,对于 pySide 中的属性和 setter ,我没有找到有值(value)的信息。 (我发现对于 qtQuick1 来说已经过时了)

如果有人给我一个有效的例子,或者给我指出某个地方,我将非常感激!干杯

最佳答案

对于PySide2,它具有相同的PySide命名法,因此我建议您检查以下link .

对于 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_())

关于python - PySide2 与 qml 作为 ui,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50160098/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com