PySide:将数据从QML传递到Python

lie*_*ewl 5 python qt pyside qml qtdeclarative

我正在尝试将数据从QML发送到Python,但出现错误。

test.py:

#!/usr/bin/env python

import sys
from PySide import QtCore, QtGui, QtDeclarative

class Test( QtCore.QObject ):
    def __init__( self ):
        QtCore.QObject.__init__(self)

    @QtCore.Slot()
    def printText(self,text):
        print text

class MainWindow( QtDeclarative.QDeclarativeView ):
    def __init__( self, parent=None ):
        super( MainWindow, self ).__init__( parent )
        self.setWindowTitle( "Test" )
        self.setSource( QtCore.QUrl.fromLocalFile( './test.qml' ) )
        self.setResizeMode( QtDeclarative.QDeclarativeView.SizeRootObjectToView )

app = QtGui.QApplication( sys.argv )
window = MainWindow()
context = window.rootContext()
context.setContextProperty("testModel",Test())
window.show()
sys.exit( app.exec_() )
Run Code Online (Sandbox Code Playgroud)

test.qml:

import QtQuick 1.0

Rectangle {
    width: 200
    height: 200
    color: "white"

    Rectangle {
        anchors.centerIn: parent
        width: 100
        height: 50
        color: "black"
        Text {
            anchors.centerIn: parent
            text: "click"
            color: "white"
        }
        MouseArea {
            anchors.fill: parent
            onClicked: {
                testModel.printText("test")
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

单击该按钮时,我希望它可以打印“测试”,但是却出现此错误:

TypeError:printText()恰好接受2个参数(给定1个)

我想念什么?

编辑:将该示例更改为一个更简单的示例。

lie*_*ewl 4

我忘记指定插槽的参数类型。通过将 printText() 的声明更改为以下内容来修复此问题:

@QtCore.Slot('QString')
def printText(self,text):
    print text
Run Code Online (Sandbox Code Playgroud)

  • 由于 QString 已被删除,我认为现在这会更好:@QtCore.Slot(str) 或 @QtCore.Slot(unicode) (3认同)