[PyQt] Connect PyQt signal to C++ slot

Phil Thompson phil at riverbankcomputing.com
Mon May 2 08:58:04 BST 2011


On Sun, 01 May 2011 20:16:53 -0500, Jack Cosgrove <jackcosgrove at gmail.com>
wrote:
> I will describe the general task I am performing beforehand as there may
> be better way to do it than I am currently trying.
> 
> I am making a Python editor and console using Qt. This includes a
> QScintilla editor and a QTextEdit for terminal output. I want to "pipe"
> stdout and stderr from the Python interpreter to the terminal as the
> Python program is executed by the interpreter.
> 
> I currently run the program using the Py_Initialize(),
> PyRun_SimpleString(), Py_Finalize() paradigm. I am able to print stdout
> and stderr to the console after the Python program has finished by
> assigning a Python class to sys.stdout and sys.stderr which has a string
> member that is later extracted using PyObject_GetAttrString after the
> Python program finishes. This is done using PyRun_SimpleString() and a
> bit of hard-coded Python in the C++ class invoking the Python
> interpreter.
> 
> However I want output from the program to be appended to the terminal as
> it is printed to stdout and stderr, not at the end of the program. My
> idea for this was to make the Python class assigned to sys.stdout and
> sys.stderr inherit from QObject, and emit a signal whenever output
> occurs. I can emit this signal when output occurs with a QString
> containing the message as an argument, but I don't know how to connect
> the PyQt signal to a C++ slot from within the C++ class that is invoking
> the Python interpreter.
> 
> Is this even possible? And if so, what functions (I suspect in sip.h)
> should I use? It looks like I would use sipConvertFromNewType to wrap
> the class with the slot with a PyObject, and then sipConnectRx to
> connect the signal to the slot that appends to the terminal.

Do it like you would call any Python method from C++. Get hold of the
signal's connect method using appropriate PyObject_GetAttr calls and call
one of the PyObject_Call functions.

Phil


More information about the PyQt mailing list