On Wednesday 29 June 2005 19:34, Henning Schröder wrote:
> Hi!
>
> Scribus is a free DTP application which is coded in C++ and Qt and
> provides scripting
> with Python.
> A Python script can import the qt module and access the data from the
> running application as far as it is reachable with the Qt-object
> system (qApp.children(), ..)
>
> Unfortunately automatic typecasting does not always work as expected.
> For example when I access qt.qApp.mainWidget() I get a QWidget. But
> the main widget is a ScribusWin-class which is derived from
> QMainWindow. So I expected  I can get a QMainWindow.
>
> Instead of writing my own SIP-wrapper for ScribusWin I would like
> better typecasting.
> Is this possible or can I do it manually?

In the C++ program do something like

  PyObject *mainWinPtr = PyLong_FromLong ((long)(QMainWindow *) 
       ptrToScribusWin);

and pass that as one of the arguments when calling into Python.

-----------------

In the Python program do:

from sip import wrapinstance, unwrapinstance
from qt import QMainWindow

def methodToBeCalledFromCPP (mainWinPtr):
  mainWin = wrapinstance (mainWinPtr, QMainWindow)
  # Python will recognize mainWin as type QMainWindow
  # and will use the instance passed (as a ptr/long) from
  # C++
  ...

  result = ... # some Qt object
  return unwrapinstance (result)  # returns a C++ pointer  as long


-----------------

Back in C++:

 // pyResult is the long returned from the call to Python
 // returned as a PyObject then converted to a pointer
 // the Qt object it points to

 // the instance can be created either in C++ or Python
 // (but of course you have make sure the Python instance
 // is persistent, as a widget owned by QMainWindow would be,
 // for example).

  QSomething *qobject = PyLong_AsLong (pyResult); 

You can do the above with any objects that have sip bindings. If you want a 
ScribusWin object in Python, you need to bind it first, but PyQt already 
binds QMainWindow.

wrapinstance and unwrapinstance are covered in the sip docs.

Jim

_______________________________________________
PyKDE mailing list    [email protected]
http://mats.imk.fraunhofer.de/mailman/listinfo/pykde

Reply via email to