Сигнал с именованным параметром

Я пытаюсь воспроизвести приведенный ниже пример, используя PySide2.

https://evileg.com/en/post/242/

Но поскольку PySide2 не поддерживает отправку сигнала с именованным параметром в QML, я понятия не имею, как это сделать с помощью PySide2?

Вот мой код

main.py

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


class Calculator(QObject):
    def __init__(self):
        QObject.__init__(self)

    sumResult = Signal(int)
    subResult = Signal(int)

    @Slot(int, int)
    def sum(self, arg1, arg2):
        self.sumResult.emit(arg1 + arg2)

    @Slot(int, int)
    def sub(self, arg1, arg2):
        self.subResult.emit(arg1 - arg2)


if __name__ == "__main__":
    import sys

    app = QGuiApplication(sys.argv)
    engine = QQmlApplicationEngine()
    calculator = Calculator()
    engine.rootContext().setContextProperty("calculator", calculator)
    engine.load("/code/QML/calc.qml")

    engine.quit.connect(app.quit)
    sys.exit(app.exec_())

person Ruchit    schedule 29.07.2018    source источник


Ответы (1)


Вы не можете воспроизвести это так, если вы хотите реализовать проект, вы можете заставить слот возвращать значение:

main.py

from PySide2 import QtCore, QtGui, QtQml


class Calculator(QtCore.QObject):
    # Slot for summing two numbers
    @QtCore.Slot(int, int, result=int)
    def sum(self, arg1, arg2):
        return arg1 + arg2

    # Slot for subtraction of two numbers
    @QtCore.Slot(int, int, result=int)
    def sub(self, arg1, arg2):
        return arg1 - arg2


if __name__ == "__main__":
    import os
    import sys

    # Create an instance of the application
    app = QtGui.QGuiApplication(sys.argv)
    # Create QML engine
    engine = QtQml.QQmlApplicationEngine()
    # Create a calculator object
    calculator = Calculator()
    # And register it in the context of QML
    engine.rootContext().setContextProperty("calculator", calculator)
    # Load the qml file into the engine
    file = os.path.join(os.path.dirname(os.path.realpath(__file__)), "main.qml")
    engine.load(file)

    engine.quit.connect(app.quit)
    sys.exit(app.exec_())

main.qml

import QtQuick 2.5
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.2
 
ApplicationWindow {
    visible: true
    width: 640
    height: 240
    title: qsTr("PyQt5 love QML")
    color: "whitesmoke"
 
    GridLayout {
        anchors.top: parent.top
        anchors.left: parent.left
        anchors.right: parent.right
        anchors.margins: 9
 
        columns: 4
        rows: 4
        rowSpacing: 10
        columnSpacing: 10
 
        Text {
            text: qsTr("First number")
        }
 
        // Input field of the first number
        TextField {
            id: firstNumber
        }
 
        Text {
            text: qsTr("Second number")
        }
 
        // Input field of the second number
        TextField {
            id: secondNumber
        }
 
        Button {
            height: 40
            Layout.fillWidth: true
            text: qsTr("Sum numbers")
 
            Layout.columnSpan: 2
 
            onClicked: {
                // Invoke the calculator slot to sum the numbers
                sumResult.text = calculator.sum(firstNumber.text, secondNumber.text)
            }
        }
 
        Text {
            text: qsTr("Result")
        }
 
        // Here we see the result of sum
        Text {
            id: sumResult
        }
 
        Button {
            height: 40
            Layout.fillWidth: true
            text: qsTr("Subtraction numbers")
 
            Layout.columnSpan: 2
 
            onClicked: {
                // Invoke the calculator slot to subtract the numbers
                subResult.text = calculator.sub(firstNumber.text, secondNumber.text)
            }
        }
 
        Text {
            text: qsTr("Result")
        }
 
        // Here we see the result of subtraction
        Text {
            id: subResult
        }
    }
}

Примечание. Для PyQt5 измените Slot на pyqtSlot.

person eyllanesc    schedule 29.07.2018
comment
Получение ниже ошибки. Есть идеи ? что сломано. QQmlApplicationEngine не удалось загрузить файл компонента:///E:/code/QML/calc.qml:1 плагин не может быть загружен для модуля QtQuick: невозможно загрузить библиотеку C:\Python27\lib\site-packages\PySide2\qml\QtQuick. 2\qtquick2plugin.dll: указанная процедура не найдена. - person Ruchit; 29.07.2018
comment
@Ruchit кажется, что .dll несовместима с вашей ОС, как вы установили pyside2? - person eyllanesc; 30.07.2018
comment
работает нормально после добавления C:\Python27\Lib\site-packages\PySide2 в переменную PATH. - person Ruchit; 30.07.2018
comment
Если вы хотите изменить значение progressBar из функции вызова python снова и снова для получения результата, это очень плохой подход. Мне было бы интересно, как это сделать с сигналом в PySide2 - person Jiri Otoupal イり オトウパー; 15.02.2021