Hi,<br>

<br>

<br>

I'm trying out PyQt and have run into a weird problem which I can't
seem to resolve. I've searched the internet and the PyQt wiki for the
answer but alas. Therefore, I turn to you in the hope you can help me.
I'm running on RedHat8, using gcc 3.2.3, QT 3.3.5 (static
multithreaded), PyQt 3.15 and SIP 4.3.1.<br>

<br>

The problem is the following: following the instructions to the letter,
I can build the PyQt libraries without any problems. I can run example
applications without problems too, _except_ for any example that uses
QCanvas. For example, if I run examples3/canvas/canvas, I get the
following error message:<br>

<br>

&nbsp;&nbsp; QPaintDevice: Must construct a QApplication before a QPaintDevice<br>

<br>

Looking at the QT source code, this is because the qApp pointer is 0.
Looking at the Python code of the example though, it's clear that the
QApplication constructor is called _before_ any constructor of a
QPaintDevice descendant, so something is very wrong.<br>

<br>

After some debugging, it appears to me that there are _two_ copies of
the qApp pointer in the program! One is defined in qt.so and the other
in qtcanvas.so. For example, if I do: &quot;nm qt.so | grep qApp | c++filt&quot;
I get:<br>

<br>

00987b0c t _GLOBAL__D_qApp<br>

00987af0 t _GLOBAL__I_qApp<br>

00a52670 t qAppendItems(QTextEngine*, int&amp;, int&amp;, BidiControl&amp;, QChar::Direction)<br>

004a6466 t func_qAppName(_object*, _object*)<br>

004a6506 t func_qAppClass(_object*, _object*)<br>

00927600 T qAppName()<br>

0092760a T qAppClass()<br>

00f5e638 D qApp<br>

00f1d59c D sipNm_qt_qApp<br>

00f1e0af D sipNm_qt_qAppClass<br>

00f1e090 D sipNm_qt_qAppName<br>

<br>

The interesting part is the &quot;D qApp&quot;, clearly indicating that qApp is defined in the data section.<br>

<br>

Doing the same command on qtcanvas.so yields:<br>

<br>

002a80ec t _GLOBAL__D_qApp<br>

002a80d0 t _GLOBAL__I_qApp<br>

0030f7d4 t qAppendItems(QTextEngine*, int&amp;, int&amp;, BidiControl&amp;, QChar::Direction)<br>

0041077c T qAppName()<br>

00410786 T qAppClass()<br>

006d8a24 D qApp<br>

<br>

Notice the last line: qApp also appears to be defined here!<br>

<br>

Therefore I conclude that Qt's qapplication.o file must be included in both qt.so and qtcanvas.so, which seems odd to me.<br>

<br>

What I _think_ happens when I run the examples3/canvas/canvas.py application is the following:<br>

1. qt.qApp get's initialized to 0 by importing the module qt and loading the qt.so file<br>

2. qtcanvas.qApp get's initialized to 0 by importing the module
qtcanvas and loading the qtcanvas.so file. I don't know how the loader
resolves the conflict of the double definition of qApp, but I'm
guessing it just creates two copies.<br>

3. qt.qApp get's initialized by calling QApplication constructor<br>

4. When the QCanvas is constructed, it refers to qtcanvas.qApp (since
that reference should have been resolved already when building the .so
file), which is still 0, so we get the error.<br>

<br>

<br>

So far for my research. Now my questions: given that I find so little
help on the web for this, I'm guessing that there's nothing wrong with
the way PyQt works, but there's something wrong with my setup or with
the way I built PyQt. I'm assuming that examples3/canvas/canvas works
fine on your system. <br>

<br>

Do you have any idea what I could be doing wrong?<br>

<br>

<br>

Thanks!<br>
<span class="sg">
<br>
&nbsp; Niels</span>