1
0
mirror of https://github.com/thp/pyotherside.git synced 2025-02-05 08:08:23 +08:00
Robie Basak 260c9c275c Fix call_sync when used with parameters
Factor out the unboxing in call() to a separate method.

To handle direct calls to call_sync(), rename the implementation of
call_sync() to call_internal() and add a call_sync() stub that calls
call_internal().

call_internal() can now takes a boolean "unbox" parameter without
impacting the formal interfaces that call() and call_sync() provide to
QML users. If the "unbox" parameter is true, it unboxes the arguments
first. If false, it doesn't.

Now call_sync() can call call_internal() requesting unboxing. call() can
also do the unboxing itself, and then later process() (the slot for
switching call() to a different thread) can call call_internal()
requesting no unboxing.

Since we now have and must keep track of two versions of the parameters
(boxed vs. unboxed), I also rename these parameters to keep things
explicit and clear.

Here's what was going wrong before:

call() was unboxing QJSValue elements inside the argument list into
plain QVariants, and then calling (indirectly, to switch threads)
call_sync().

call_sync() did no such unboxing. Since call_sync() is exposed directly
as an entry point, this meant that priv->call(), which appears to expect
unboxed argument lists, was failing in this case.

There is a comment noting that call() should do the unboxing in the GUI
thread so should not defer it. So the unboxing has to happen in two
different places depending on whether the user called call() or
call_sync().

Fixes: #49
2017-01-04 22:59:43 +00:00
2016-06-14 19:32:24 +02:00
2016-08-03 15:36:19 +01:00
2016-06-14 19:32:24 +02:00

PyOtherSide: Asynchronous Python 3 Bindings for Qt 5
====================================================

A Qt 5 QML Plugin that provides access to a Python 3 interpreter from QML.


Requirements:

    Qt >= 5.1.0
    Python >= 3.3.0


To build and install the QML plugin:

    qmake
    make
    make install


To build against a specific Python version, use:

    qmake PYTHON_CONFIG=python3.3-config
    make
    make install


To manually update the qmltypes file on x64 Linux (TODO: make this automated):

    qmake
    make
    make INSTALL_ROOT=$(pwd)/tmp/
    qmlplugindump io.thp.pyotherside 1.0 tmp/usr/lib/x86_64-linux-gnu/qt5/qml \
        >src/pyotherside.qmltypes


To run the included unit tests after building, use:

    ./tests/tests


If you want to link PyOtherSide statically against Python 3, you can include
the Python Standard Library in PyOtherSide as Qt Resource and have it extracted
automatically on load, for this, zip up the Standard Library and place the .zip
file as "pythonlib.zip" into src/ before running qmake.


More information:

    Project page: https://thp.io/2011/pyotherside/
    Git repo: http://github.com/thp/pyotherside/
    Bug tracker: https://github.com/thp/pyotherside/issues
    Documentation: http://pyotherside.readthedocs.org/
Description
No description provided
Readme ISC 725 KiB
Languages
C++ 83.2%
QML 10.2%
Python 2.7%
QMake 1.8%
C 1.6%
Other 0.5%