PySide2 с qml в качестве пользовательского интерфейса - PullRequest
0 голосов
/ 03 мая 2018

Я использую 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)

если кто-нибудь даст мне рабочий пример или покажет мне куда-нибудь, я буду очень благодарен! веселит

1 Ответ

0 голосов
/ 03 мая 2018

В случае PySide2 он имеет такую ​​же номенклатуру PySide, поэтому я рекомендую вам проверить следующую ссылку .

В случае PySide вы должны использовать свойство, аналогичное pyqtProperty, слот равен pyqtSlot, а сигнал равен 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_())
...