Reputation: 2784
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
Upvotes: 4
Views: 6746
Reputation: 3487
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()
}
}
Upvotes: 2
Reputation: 141
Perhaps you may "inject" whatever you want to return from testSlot function into a property of the class where the signal is emmited
Upvotes: 0
Reputation: 1093
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 e.g. 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".
Upvotes: 4