6

QMLは、Connectionsオブジェクトを使用してPythonから発信されたシグナルを受信できることに気づきました。残念ながら、そのオブジェクトがそのシグナルの引数を受け取るようにする方法を理解できません。

私がやりたいことを示す最小限のテストケースを作成しました。

min.py

from PySide import QtCore, QtGui, QtDeclarative
import sys

# init Qt
app = QtGui.QApplication(sys.argv)

# set up the signal
class Signaller(QtCore.QObject):
    emitted = QtCore.Signal(str)

signaller = Signaller()

# Load the QML
qt_view = QtDeclarative.QDeclarativeView()
context = qt_view.rootContext()
context.setContextProperty('signaller', signaller)
qt_view.setResizeMode(QtDeclarative.QDeclarativeView.SizeRootObjectToView)
qt_view.setSource('min.qml')
qt_view.show()

# launch the signal
signaller.emitted.emit("Please display THIS text!")

# Run!
app.exec_()

そしてmin.qml

import QtQuick 1.0

Rectangle {
    width:300; height:100

    Text {
        id: display
        text: "No signal yet detected!"

        Connections {
            target: signaller
            onEmitted: {
                display.text = "???" //how to get the argument?
            }
        }
    }
}
4

3 に答える 3

6

Qt for Pythonバージョン5.12.5、5.13.1の時点では、PyQtと同じように機能しています。

from PySide2.QtCore import Signal

sumResult = Signal(int, arguments=['sum'])
sumResult.emit(42)

QML:

onSumResult: console.log(sum)
于 2019-09-13T18:02:23.633 に答える
5

Qt 4.8以降、PySideはシグナルパラメーター名をまったく処理しません。

ただし、名前付きパラメーターを使用してQMLシグナルを作成し、Javascriptを使用してPythonシグナルをそれに接続することができます。

import QtQuick 1.0

Rectangle {
    width:300; height:100


    Text {
        id: display
        text: "No signal yet detected!"

        signal reemitted(string text)
        Component.onCompleted: signaller.emitted.connect(reemitted)

        onReemitted: {
          display.text = text;        
        }
    }
}
于 2012-05-08T22:35:18.820 に答える
0

申し訳ありませんが、評判を上げる必要があるため、コメントできません。「存在しないプロパティに割り当てることができません」への応答は、アプリケーションを初期化する順序が原因です。ルートコンテキストオブジェクトは、エンジンの前に作成する必要があります。

Ok:

context = Context() engine = QQmlApplicationEngine() engine.rootContext().setContextProperty("context", context)

良くないですよ:

engine = QQmlApplicationEngine() context = Context() engine.rootContext().setContextProperty("context", context)

于 2020-04-14T21:14:28.057 に答える