简体   繁体   中英

PySide: Returning a value from a slot

The Pyside documentation states that slots can have return values, but I have yet to figure out how make it do so.

I couldn't find any usable code samples on this, so I've added a decorator as the docs suggest:

def testSlot(self):
    print('testSlot called')
    return 'RETURN VALUE RETURN VALUE RETURN VALUE'

And I'm trying to capture the return value like this:

ret = foo.testSignal.emit()

But it's not working. My test code, which you can find here , also crashes with this error output. Help is appreciated!

Edit: I've removed the decorator, which solves the crashing issue, but it still doesn't return the value I want it to return.

Running the script as is give me this:

foo.testSignal.emit()
testSlot called
True

I'm afraid what you think is not possible. Signals and slots are loosely coupled together, so emitting a signal does not directly call a slot, and therefore cannot retrieve "its" return value .

This might be clearer if you think about this:

You can connect 2 different slots (of eg 2 different classes), which return different values, to one signal . Which of the two return values are supposed to reach the variable you try to assign?

What you probably mean is this : This is something completely different, and allows return values via "invoking" the method over the MetaObject system by "name".

也许您可以将想要从 testSlot 函数返回的任何内容“注入”到发出信号的类的属性中

This question is old but it seems now there is a way to do return a value from a slot call (call python/PySide2 slot from QML ):

Python Side (Slot) :

# Main.py
# add imports ... 

# Class to set the context on QML frontend
class PythonQObject(QObject):

  @Slot(result=int)
  def returnSomeInt(self):
    return 456


# Set the context etc, on main
if __name__ == "__main__":
  pyQObject = PythonQObject()
  app = QApplication(sys.argv)
  engine = QQmlApplicationEngine()
  engine.rootContext().setContextProperty("backend", pyQObject )
  engine.load(os.path.join(basedir, 'main.qml'))
  sys.exit(app.exec_())
  

QML Side:

/* main.qml */
import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.15

Window {
    id: mainWindow

    Component.onCompleted: {
        /* Get the return value from slot here */
        let value = backend.returnSomeInt()
    }

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM